Chmod rekursiv

249

Ich habe ein Archiv, das von einer anderen Person archiviert wird, und ich möchte nach dem Herunterladen automatisch einen Zweig des Dateisystems in den extrahierten Dateien ändern, um Lesezugriff zu erhalten. (Ich kann nicht ändern, wie das Archiv erstellt wird).

Ich habe mir diesen Thread angesehen: chmod: Wie man rekursiv Ausführungsberechtigungen nur zu Dateien hinzufügt, die bereits Ausführungsberechtigungen haben, wie in einigen anderen, aber keine Freude.

Die Verzeichnisse enthalten ursprünglich mehrere, aber alle falschen Flags. Sie können wie folgt aussehen:

drwx------
d---r-x---
drwxrwxr-x
dr--r-xr--

Dies sind nur die wenigen, die ich bisher entdeckt habe, aber es könnte auch mehr sein.

findFehler, wenn versucht wird, ein Verzeichnis ohne xBerechtigung zu durchsuchen, und es daher nicht weitergibt chmod. Was ich bisher getan habe, ist, die Berechtigungen für das übergeordnete Verzeichnis manuell zu ändern, dann in die untergeordneten Verzeichnisse zu wechseln und dasselbe für sie zu tun und so weiter. Aber das ist viel Handarbeit. Gibt es keine Möglichkeit, dies automatisch zu tun?

Dh wie ich es jetzt mache:

machen:

$ chmod -R +x
$ chmod -R +r

bis ich dann keine fehler bekomme

$ find -type f -exec chmod -x {} +

Aber es muss einen besseren Weg geben.

Gemeinschaft
quelle
3
-r nicht das gleiche wie -R
PJ Brunet
Verschiedenes, wenn Sie sagen möchten, dass alle Gruppenberechtigungen mit den Eigentümerberechtigungen übereinstimmen (es ist weniger wahrscheinlich, dass IMO alles durcheinander
bringt

Antworten:

131

Sie benötigen zusätzlich zum Ausführen des Zugriffs Lesezugriff, um ein Verzeichnis aufzulisten. Wenn Sie nur Ausführungszugriff haben, können Sie die Namen der Einträge im Verzeichnis herausfinden, aber keine anderen Informationen (nicht einmal Typen, sodass Sie nicht wissen, welche der Einträge Unterverzeichnisse sind). Das funktioniert bei mir:

find . -type d -exec chmod +rx {} \;
Fred Foo
quelle
2
Was ist der Unterschied zwischen '\;' und '+', das vom OP am Ende des Befehls verwendet wurde?
Kon Psych
1
@konpsych Baut anscheinend +die Kommandozeile anders auf. Ich war mir dessen eigentlich nicht bewusst; \;ist der übliche Weg, mit einem Befehl pro Datei, der der Suche entspricht.
Fred Foo
Funktioniert nicht, wenn einige Dateien Leerzeichen in ihrem Namen haben
Soonts
3
@Soonts Dann "{}"statt {}sollte es beheben.
user4642212
Ich habe dies unter dem Linux-Subsystem unter Windows 10 ausgeführt und es hatte den gegenteiligen Effekt. Die meisten Dateiberechtigungen wurden entfernt.
Max Candocia
176

Sie können chmod mit dem verwenden X Modusbuchstaben (dem Großbuchstaben X) verwenden, um das ausführbare Flag nur für Verzeichnisse zu setzen.

Im folgenden Beispiel wird das ausführbare Flag gelöscht und dann rekursiv für alle Verzeichnisse gesetzt:

~$ mkdir foo
~$ mkdir foo/bar
~$ mkdir foo/baz
~$ touch foo/x
~$ touch foo/y

~$ chmod -R go-X foo 
~$ ls -l foo
total 8
drwxrw-r-- 2 wq wq 4096 Nov 14 15:31 bar
drwxrw-r-- 2 wq wq 4096 Nov 14 15:31 baz
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 x
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 y

~$ chmod -R go+X foo 
~$ ls -l foo
total 8
drwxrwxr-x 2 wq wq 4096 Nov 14 15:31 bar
drwxrwxr-x 2 wq wq 4096 Nov 14 15:31 baz
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 x
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 y

Ein bisschen Erklärung:

  • chmod -x foo- Löschen Sie das eXecutable- Flag fürfoo
  • chmod +x foo- Setzen Sie das eXecutable- Flag fürfoo
  • chmod go+x foo- Wie oben, aber setzen Sie das Flag nur für Gruppen- und andere Benutzer. Berühren Sie den Benutzer nicht Berechtigung (Eigentümer)
  • chmod go+X foo - Wie oben, jedoch nur für Verzeichnisse gelten. Dateien nicht berühren
  • chmod -R go+X foo- wie oben, jedoch rekursiv für alle Unterverzeichnisse vonfoo
Dmitry
quelle
80

Versuchen Sie, alle Berechtigungen gleichzeitig zu ändern:

chmod -R +xr
Choroba
quelle
Dadurch werden auch Ausführungsberechtigungen für alle Nicht-Verzeichnisse erteilt.
Fred Foo
1
Ja. Dies ersetzt nur den ersten iterierten Schritt. Sie müssen find -type f -exec chmod -x {} +danach noch laufen .
Choroba
50

Um alles vom Eigentümer beschreibbar zu machen, lesen / ausführen Sie es von der Gruppe und die Welt ausführbar:

chmod -R 0755

Um alles weit offen zu machen:

chmod -R 0777
Tim Jensen
quelle
12
Fügen Sie den aktuellen Ordner hinzu:chmod -R 0777 .
Danijel
18

Rekursives Hinzufügen ausführbarer Berechtigungen zu allen Dateien (nicht Ordnern) im aktuellen Ordner mit der shErweiterung:

find . -name '*.sh' -type f | xargs chmod +x

* Beachten Sie die Pipe ( |)

AlikElzin-Kilaka
quelle
2

Geben Sie 0777 für alle Dateien und Verzeichnisse ab dem aktuellen Pfad ein:

chmod -R 0777 ./

Anthony Vinay
quelle