it-swarm.com.de

Chmod rekursiv

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 in diesem Thread nachgesehen: chmod: Wie füge ich rekursiv Ausführungsberechtigungen nur für Dateien hinzu, die bereits Ausführungsberechtigung haben wie bei einigen anderen, aber keine Freude.

Die Verzeichnisse enthalten ursprünglich mehrere, aber alle falschen Flags. Sie können folgendermaßen aussehen:

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

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

find gibt einen Fehler aus, wenn versucht wird, in ein Verzeichnis ohne x-Berechtigung zu suchen, und es daher nicht an chmod übergibt. Was ich bisher getan habe, ist, die Berechtigungen für das übergeordnete Verzeichnis manuell zu ändern, dann in die untergeordneten Verzeichnisse zu gehen und das gleiche für sie und so weiter zu tun. Aber das ist viel Handarbeit. Gibt es keine Möglichkeit, dies automatisch zu tun?

Das heißt wie mache ich es jetzt:

tun:

$ 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.

214
user797257

Sie benötigen zusätzlich zum Ausführen des Zugriffs Lesezugriff, um ein Verzeichnis aufzulisten. Wenn Sie nur über Ausführungszugriff verfügen, können Sie die Namen der Einträge im Verzeichnis herausfinden, jedoch keine weiteren Informationen (nicht einmal Typen), sodass Sie nicht wissen, welche Einträge Unterverzeichnisse sind. Das funktioniert für mich:

find . -type d -exec chmod +rx {} \;
115
Fred Foo

Sie können chmod mit dem 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 für alle Verzeichnisse rekursiv 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ösche das Flag eXecutable für foo
  • chmod +x foo - setzt das eXecutable Flag für foo
  • chmod go+x foo - wie oben, aber setzen Sie das Flag nur für Group und Other Benutzer, berühren Sie nicht die Berechtigung User (Eigentümer)
  • chmod go+X foo - wie oben, gilt jedoch nur für Verzeichnisse, berühren Sie keine Dateien
  • chmod -R go+X foo - wie oben, aber tun Sie dies Rekursiv für alle Unterverzeichnisse von foo
159

Versuchen Sie, alle Berechtigungen gleichzeitig zu ändern:

chmod -R +xr
75
choroba

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

chmod -R 0755

Um alles weit offen zu machen:

chmod -R 0777
45
Tim Jensen

Hinzufügen von ausführbaren Berechtigungen, rekursiv, zu allen Dateien (nicht Ordnern) innerhalb des aktuellen Ordners mit der Erweiterung sh:

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

* Beachten Sie die Pipe (|)

13

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

chmod -R 0777 ./

0
Anthony Vinay