Shell-Skript zum rekursiven Durchlaufen eines Verzeichnisses und zum Ändern basierend auf den Bedingungen des Dateityps

7

Kann mich jemand auf Code oder ein Tutorial zum Schreiben eines Shell-Skripts verweisen, das rekursiv eine gesamte Verzeichnisstruktur durchlaufen kann (beginnend mit dem aktuellen Arbeitsverzeichnis oder mit einem erforderlichen Argument, wo ich anfangen soll) und kann:

  1. Bestimmen Sie, ob ein Element ein Verzeichnis ist und ob es chmod 755... oder ...
  2. Bestimmen Sie, ob ein Element eine Datei (kein Verzeichnis) ist, und zwar chmod 644.

Ich suche nach Kompatibilität mit Ubuntu, Debian, RHEL-Based usw., daher markiere ich dies nicht mit einer bestimmten Sprache. Ich würde das in Bash mögen, aber wenn Sie ein ZSH-Skript haben, wird das auch funktionieren.

Thomas Ward
quelle

Antworten:

9

Ich bin an diesen einzeiligen Befehl gewöhnt (wird ab dem aktuellen Arbeitsverzeichnis wiederholt)

find . -type d -exec chmod 0755 '{}' + -or -type f -exec chmod 0644 '{}' +

Erläuterung:

find .                    # starting in curdir find   
-type d                   # any directory
-exec chmod 0755 '{}'     # and chmod it to 755
+                         # (variant of -exec look find man page)
-or                       # or
-type f                   # any file
-exec chmod 0644 '{}'     # and chmod it to 644
+                         # (as above)
Guido
quelle
Das hat funktioniert. Ich nehme es, wenn ich dies in einem Skript mache, und ich setze ein, cd /path/to/dir/es ändert das Arbeitsverzeichnis, so dass ich es als argumentbasiertes Kommando / Skript verwenden kann?
Thomas Ward
Ich habe gerade getestet und CD scheint das Arbeitsverzeichnis in einem Skript zu ändern. Ich bin mir jedoch nicht sicher, ob es Ausnahmen gibt.
@palintropos cdändert das Arbeitsverzeichnis in Skripten. Wenn Ihnen das noch nie passiert ist, ist das ziemlich seltsam. Vielleicht möchten Sie eine neue Frage dazu stellen ... mit Details.
Eliah Kagan
@palitropos in Ihrem Skript können Sie einfach das oberste Verzeichnis übergeben, um zu finden, anstatt.
Guido
1
Winziger Nitpick: Dies wäre eine vollständig portable Lösung mit -oanstelle von -or(ein GNUism, das gilt auch für -and).
Ormaaj
3

Die einfache Antwort:

chmod -R a+rX .

+X(Beachten Sie das Großbuchstaben X) bedeutet, die Ausführungsberechtigung zu erteilen, wenn die Ausführungsberechtigung für einen Benutzer bereits vorhanden war. Wenn Sie über einen Verzeichnisbaum verfügen, der über die richtigen Berechtigungen für den Eigentümer verfügt, und diesen für alle zugänglich machen möchten, ist dies der richtige Befehl. Verzeichnisse werden nicht nur weltweit ausführbar, sondern auch ausführbare Dateien.

Wenn Sie auch die Schreibberechtigungen nur für den Eigentümer zurücksetzen und alle setuid / setgid-Bits löschen möchten, machen Sie das

chmod -R a-ws,u+w,a+rX .

Der obligatorische zsh Two-Liner, wenn Sie keine Datei ausführbar machen möchten:

chmod 755 **/*(/)
chmod 644 **/*(.)
Gilles 'SO - hör auf böse zu sein'
quelle