Rekursives chmod: rw für Dateien, rwx für Verzeichnisse

28

Ich möchte chmodviele Dateien und Verzeichnisse. Als xListe für Verzeichnisse angeben und für normale Dateien ausführen möchte ich mich rwfür Dateien und rwxfür Verzeichnisse bewerben . Ist es nur mit dem chmodBefehl möglich?

Wenn nicht, was ist der bequemste Weg?

Dies chmod -R 770ist keine Möglichkeit, da ich nicht möchte, dass die regulären Dateien ausführbar werden.

Gelöscht
quelle
1
Möchten Sie wirklich eine öffentliche Schreibberechtigung für Dateien und Verzeichnisse? Das bedeutet, dass es Ihnen egal ist, wer eine der Dateien blockiert?
Jonathan Leffler
Wahr. Ich habe es oben geändert.
Gelöscht

Antworten:

19

Ich mache das gelegentlich mit einem einzigen findBefehl. Hässlich aber effektiv.

find /p/a/t/h \( -type d -exec chmod 755 {} \; \) -o \( -type f -exec chmod 644 {} \; \)
baumgart
quelle
Muss "{}" nicht in Anführungszeichen gesetzt werden, nur für den Fall, dass Pfade Leerzeichen enthalten? Like find . -type d -exec chmod -vc 755 "{}" \;(auch -vcfür ein paar Rückmeldungen). (Und vielleicht, um das zu verdeutlichen, fügen Sie auch die beiden Standalone-Befehle zur Antwort hinzu?)
Arjan
Nein, {} muss nicht angegeben werden (ich habe nur getestet, um absolut sicher zu sein). Wenn find {} in den Befehl einfügt, wird dieser ordnungsgemäß maskiert. Ich habe die inneren Funktionen von find nicht nachgeschlagen, aber ich würde annehmen, dass es ein Argument-Array erstellt, das an exec () übergeben wird, und den Dateinamen in das Array strcpy (). Wenn chmod seine Argumente betrachtet, würde es richtig angezeigt.
baumgart
37

Verwenden Sie die X-Berechtigung auf der Manpage:

Die Ausführungs- / Suchbits, wenn die Datei ein Verzeichnis ist, oder eines der Ausführungs- / Suchbits werden in den ursprünglichen (nicht modifizierten) Modus versetzt. Operationen mit dem Perm-Symbol "X" sind nur in Verbindung mit dem Op-Symbol "+" sinnvoll und werden in allen anderen Fällen ignoriert.

Also mache folgendes:

chmod -R a-x [directory]
chmod -R a+rwX [directory]

Dadurch wird das Ausführungsbit aus allen Dateien und Verzeichnissen entfernt, gefolgt vom Hinzufügen von Lese- und Schreibberechtigungen für alle Dateien und von Ausführungsberechtigungen nur für Verzeichnisse. (Bei normalen Dateien ist das Ausführungsbit vom ersten Schritt an nicht mehr aktiviert.)

Ben S
quelle
1
Dies erzwingt nicht den Modus 666 für reguläre Dateien. Das ausführbare Bit für reguläre Dateien wird nicht gelöscht, wenn sie es bereits gesetzt haben.
Quack Quijote
Also in diesem Fall könnten Sie tun, chmod -R a-x [directory]gefolgt von chmod -R a+rwX [directory]?
Jwaddell
@jwaddel: Das sollte funktionieren. Sie entfernen alle Bits ausführen, unabhängig von Datei / Verzeichnistyp, dann nur Verzeichnisse und regelmäßige Hinzufügen von Dateien ausführen , die bereits das Execute - Bit haben auf (die jetzt keine ist.)
Ben S
Sobald ich das tue a-x, ist das Verzeichnis nicht zugänglich. Tatsächlich schlägt chmod mit verweigerter Berechtigung fehl und entfernt kein ausführbares Bit aus den Dateien im Verzeichnis. Gibt es eine Möglichkeit, dies zu tun, ohne root zu sein?
Avakar
14

Sie können auch findzusammen mit xargs:

find . -type f -print0 | xargs -0 chmod 666
find . -type d -print0 | xargs -0 chmod 777

wo -typeSpezifiziert d irectory oder f ile.

John T
quelle
1
Gibt es bei Xargs keine Längenbeschränkung? Es ist eine Menge Dateien und Verzeichnisse.
Gelöscht
2
Ich würde zuerst Verzeichnisse machen, dann Dateien. Andernfalls besteht die Gefahr, dass Sie einen Teilbaum verpassen, da keine Berechtigung vorliegt. Außerdem sollten Sie prüfen, ob die Liste vor oder nach dem chmod durchsucht wird, ansonsten wie oben. Und ja, ich würde auf die Verwendung von Xargs verzichten.
Stefano Borini
1
xargsist intelligent genug, um lange Befehlszeilen für mehrere Ausführungen zu unterbrechen. Konsultieren Sie Ihre xargs-Manpage und achten Sie darauf, dies zu überprüfen xargs --show-limits.
Mike