Wie entferne ich ein ausführbares Bit rekursiv aus Dateien (nicht aus Verzeichnissen)?

73

Wenn ich einen USB-Stick (FAT) an meinen Mac oder Ubuntu-Computer anschließe, sind für alle Dateien die ausführbaren Bits gesetzt. Wie entferne ich nach dem Kopieren der Verzeichnisstruktur auf meine Festplatte die ausführbaren Bits rekursiv nur aus den Dateien und behalte diese in den Verzeichnissen?

Mike L.
quelle

Antworten:

132

Mit GNU chmod(unter Ubuntu) Einzelbefehlsvariante (beginnend im aktuellen Verzeichnis):

chmod -R -x+X .

Erläuterung:

  • -R - rekursiv arbeiten
  • -x - ausführbare Flags für alle Benutzer entfernen
  • +X - Ausführbare Flags für alle Benutzer setzen, wenn es sich um ein Verzeichnis handelt

In diesem Fall gilt das Kapital Xnur für Verzeichnisse, da alle ausführbaren Flags von gelöscht wurden -x. Andernfalls +Xwerden ausführbare Flags gesetzt, auch wenn das Flag ursprünglich für einen Benutzer, eine Gruppe oder andere Benutzer gesetzt wurde.

Mit BSD chmod(das auf Mac OS X vorhanden ist) müssen Sie dies in zwei Befehlen separat ausführen:

sudo chmod -R -x * && sudo chmod -R +X *

(Wenn Sie auch versteckte Dateien in das Hauptverzeichnis aufnehmen möchten, müssen Sie wahrscheinlich * in. (Point) ändern, dies ist jedoch nicht getestet.)

Pabouk
quelle
Unter Ubuntu 13.04 ist eine kleine Änderung erforderlich:chmod -R a-x+X *
Eero Aaltonen
@ EeroAaltonen: Danke für den Hinweis. Dies kann passieren, wenn Sie umasknicht xfür alle die Erlaubnis erteilen. Verwenden Sie die Standardeinstellung umaskoder haben Sie sie geändert? Könnten Sie bitte die Ausgabe des umaskBefehls senden ? Neben Ihrer Lösung gibt es auch diese Möglichkeit: chmod -R a-x,+X *Die xBerechtigung wird entsprechend Ihrer festgelegt umask. Ich werde die Antwort aktualisieren, aber ich möchte zuerst das Verhalten in BSD / Mac OS X überprüfen.
Pabouk
@pabouk oopsie! Es war eigentlich die CentOs-Box, in der ich meine umask auf 0007 eingestellt hatte.
Eero Aaltonen
Das ist nur traurig ... :( Ich mag die findVariante in der Antwort unten, weil sie einfache Werkzeuge kombiniert, die One Thing Well
leisten
2
Verwenden Sie .stattdessen, *wenn dies auf alle Dateien angewendet werden soll
John Magnolia,
46

Wenn Sie zuerst den richtigen Pfad eingeben:

find . -type f -exec chmod -x {} \;

oder

chmod -x $(find . -type f)

Der Suchvorgang findet alle Dateien des Typs 'f' (was reguläre Datei bedeutet) im Pfad. und ruft dann chmod -x für jede Datei auf. Das {} ersetzt den Dateinamen und das \; Beendet den Befehl chmod.

Matthijs P
quelle
6
Wenn es von Ihnen findunterstützt wird, verwenden Sie -exec ... \+stattdessen -exec ... \;- es werden weniger fork+ execs benötigt. Wenn nicht, benutze find ... -print0 | xargs -0 ....
Ephemient
5
Ich habe diese Technik verwendet, aber mit "-perm +111" zum Fund hinzugefügt, so dass nur diejenigen von chmod das x-Bit gesetzt haben:find . -type f -perm +111 -exec chmod -x {} \;
chrish
4
+1 @Matthijs Der Grund, warum dies besser ist als die Lösung von pabouk, ist, dass dieser Befehl Verzeichnisse in Ruhe lässt, während pabouks das ausführbare Bit in allen Verzeichnissen zurücksetzt. Es kann einige Verzeichnisse geben, in denen das ausführbare Bit nicht gesetzt ist, und der Befehl von pabouk setzt es, während man sie vielleicht so lassen möchte, wie sie sind.
MariusMatutiae
Der zweite Ansatz schlägt für Pfade fehl, die Leerzeichen enthalten.
MestreLion
@ephemient: Wenn Ihre findUnterstützung -print0ich bin ziemlich sicher, wird es auch unterstützen-exec
MestreLion
3

Verwenden Sie unter Linux und Unix in einem Terminalfenster oder unter Mac OS X in Terminal.app Folgendes:

find . -type f -print0 | xargs -0 chmod -x
user227317
quelle
1
Dies unterscheidet sich im Wesentlichen nicht von der Antwort von Matthijs P aus dem Jahr 2011.
slhck
Können Sie sich an diese Befehlszeile erinnern? Ich kann nicht
Mike L.
Siehe den Kommentar von Ephemient unter Matthijs 'Antwort, um zu sehen, warum diese Antwort nützlich ist.
PatrickT
2

Der chmod -x+XWeg funktionierte für mich auch nicht auf Ubuntu, also schrieb ich dieses minimale Python-Skript:

#!/usr/bin/python3
import os
for par, dirs, files in os.walk('.'):
    for d in dirs:
        os.chmod(par + '/' + d, 0o755)
    for f in files:
        os.chmod(par + '/' + f, 0o644)

Wenn sich in Ihrem Dateisystem noch etwas Besonderes befindet, wie z. B. Sockets, sollten Sie den letzten chmod mit einem try / catch-Befehl umgeben.

Mäuse
quelle