Dateiberechtigung aber nicht Verzeichnisse rekursiv ändern?

13

Ich habe die Berechtigungen einiger Dateien, die ich auf ein Unix-System migriert hatte, massiv rekursiv geändert. Ich habe sie in ug + rw geändert, aber dann habe ich festgestellt, dass ich keine Unterverzeichnisse durchlaufen kann. Ich habe in der Manpage nach gesucht chmodund keine Erklärung für das Ausschließen von Verzeichnissen gefunden. Daher habe ich ein wenig gegoogelt und festgestellt, dass findBenutzer die Berechtigungen für Verzeichnisse so geändert haben, dass sie für Benutzer und Gruppen "ausgeführt" wurden. Ich habe das getan und dann konnte ich sie untersuchen.

Aber es schien mir, dass ich in der Lage sein sollte, diese Suche chmoddurchzuführen - die Dateien rekursiv in Lesen / Schreiben zu ändern, aber die Verzeichnisse nicht unübersetzbar zu machen. Habe ich das richtig gemacht oder gibt es einen einfacheren Weg, es zu tun?

user394
quelle

Antworten:

12

Die bessere Lösung sollte sein

chmod -R ug=rwX,o=rX /path

Dabei Xbedeutet die Groß- / Kleinschreibung: setze Ausführungsbit wenn

Die Datei ist ein Verzeichnis oder hat bereits Ausführungsberechtigung für einen Benutzer

(Zitiert aus der chmodManpage).

Oder auch, wenn Sie verwenden möchten find

find /path \( -type f -exec chmod ug=rw,o=r   {} + \) -o \
           \( -type d -exec chmod ug=rwx,o=rx {} + \)
Enzotib
quelle
Ich habe die für alle offene Version dieses Befehls für meine USB-Festplatte verwendet: chmod -v -R ugo = rwX / path Danke!
Der
Offenbar gibt es keine Möglichkeit , ohne findzu 700.em alle Dateiberechtigungen auf 600 und alle Verzeichnisberechtigungen setzen (ich kam hier durch meine googlings zu diesem Thema.) Wenn das kann mit einem einzigen erfolgen chmod -RBefehl, fühlen Sie sich frei , mich zu korrigieren.
Wildcard
@Wildcard: nicht genau, der Befehl chmod -R u=rwX,go= /pathmacht fast das, was Sie wollen: Er setzt alle Verzeichnisse auf 700 und alle Dateien auf 600 oder 700, je nachdem, ob das Ausführungsbit bereits gesetzt ist oder nicht, und ich denke, das ist das Richtige .
Enzotib
1
@enzotib, ja - fast, aber nicht ganz. In meinem Fall möchte ich das Ausführungsbit für alle Dateien (aber natürlich nicht für Verzeichnisse) deaktivieren, unabhängig davon, ob es sich um Skripte oder Binärdateien handelt oder was auch immer. Der von findIhnen geschriebene Befehl war also als Vorlage sehr hilfreich. :)
Wildcard
@Wildcard Wie wäre es, wenn Sie das Ausführungsbit zuerst rekursiv entfernen und es dann nur mit dem obigen Befehl wieder zu Verzeichnissen hinzufügen?
Michael
3

Find ist der 'richtige' Weg und der einzige programmatische Weg, obwohl es Variationen gibt:

find . -type f -exec chmod ug+rw {} +  # "+" may not be on all systems

oder

find . -type f -print0 | xargs -r0 chmod ug+rw  # similar to the -exec + functionality

oder der langsamste:

find . -type f -exec chmod ug+rw {} \;  # in case xargs is not installed

Jede dieser Optionen wählt eine Datei aus (kein Verzeichnis, kein Symlink) und wendet den chmodBefehl darauf an. Die ersten beiden verringern die Anzahl der Aufrufe, chmodindem die Datei jedes Mal an das Ende einer internen Befehlszeile angehängt wird, bis ein Maximum (häufig 10) erreicht ist. Anschließend wird der Befehl aufgerufen und die Neuerstellung eines neuen Befehls gestartet. Die letzte Anweisung erzeugt für jede Datei einen neuen Prozess, der weniger effizient ist.

Arcege
quelle