Wie chmod 755 alle Verzeichnisse, aber keine Datei (rekursiv)?
Umgekehrt, wie man nur Dateien (rekursiv) aber kein Verzeichnis chmod?
permissions
chmod
Olivier Lalonde
quelle
quelle
Antworten:
So geben Sie Verzeichnissen rekursiv Lese- und Ausführungsrechte:
So erteilen Sie Dateien rekursiv Leserechte:
Oder wenn es viele zu verarbeitende Objekte gibt:
Oder, um das
chmod
Laichen zu reduzieren :quelle
-bash: /bin/chmod: Argument list too long
. Der letzte Befehl funktioniert mit vielen Dateien, aber wenn Siesudo
einen verwenden, müssen Sie darauf achten, ihn vor xargs anstelle von chmod zu setzen:find /path/to/base/dir -type d -print0 | sudo xargs -0 chmod 755
dir
auch auf 755 gesetzt.chmod ... $(find /path/to/base/dir -type ...)
schlägt bei Dateinamen mit Leerzeichen im Namen fehl.find /path/to/base/dir -type d -exec chmod 755 {} \;
(find /path/to/base/dir -type f -exec chmod 644 {} \;
).Ein häufiger Grund dafür ist, dass Verzeichnisse auf 755 und Dateien auf 644 gesetzt werden. In diesem Fall gibt es einen etwas schnelleren Weg als in Niks
find
Beispiel:Bedeutung:
-R
= rekursiv;u+rwX
= Benutzer können lesen, schreiben und ausführen;go+rX
= Gruppe und andere können lesen und ausführen;go-w
= Gruppe und andere können nicht schreibenWichtig hierbei ist, dass sich Groß-
X
und Kleinschreibung unterscheidenx
. Im Handbuch können wir lesen:Mit anderen Worten, chmod u + X in einer Datei setzt das Ausführungsbit nicht. und g + X setzt es nur, wenn es bereits für den Benutzer eingestellt ist.
quelle
chmod -R 777
da die+X
Option vorhandene Ausführungsbits für Dateien nicht zurücksetzt. Mit -x werden Verzeichnisse zurückgesetzt und ein Abstieg in diese verhindert.X
, wie in den Kommentaren erläutert.go+rX,go-w
->go=rX
nicht wahrchmod u-x,u+X
in Kombination usw. verwenden, um Ausführungsbits für Dateien zu entfernen, diese jedoch für Verzeichnisse hinzuzufügen.Wenn Sie sicherstellen möchten, dass die Dateien auf 644 gesetzt sind und sich im Pfad Dateien mit dem Ausführungsflag befinden, müssen Sie zuerst das Ausführungsflag entfernen. + X entfernt das Ausführungsflag nicht von Dateien, die es bereits haben.
Beispiel:
Update: Dies scheint zu scheitern, da das Verzeichnis bei der ersten Änderung (ugo-x) nicht mehr ausführbar ist, sodass alle Dateien darunter nicht geändert werden.
quelle
chmod -R ugo-x path
haben, könnte das ein Problem sein. Aber der vollständige Befehl führt daschmod u+rwX
in jedem Verzeichnis aus, bevor er versucht, in dieses Verzeichnis zu gelangen.) Ich glaube jedoch, dass dieschmod R u=rw,go=r,a+X path
ausreicht - und dass es kürzer ist.Ich beschloss, selbst ein kleines Skript dafür zu schreiben.
Rekursives chmod-Skript für Verzeichnisse und / oder Dateien - Gist :
chmodr.sh
Es führt im Grunde genommen das rekursive chmod aus, bietet aber auch ein wenig Flexibilität für Befehlszeilenoptionen (setzt Verzeichnis- und / oder Dateiberechtigungen oder schließt beides aus, setzt automatisch alles auf 755-644 zurück). Es wird auch nach einigen Fehlerszenarien gesucht.
Ich habe auch in meinem Blog darüber geschrieben .
quelle
So geben Sie Verzeichnissen rekursiv Lese- und Ausführungsrechte:
So erteilen Sie Dateien rekursiv Leserechte:
Besser spät als nie lass mich Niks Antwort auf die Seite der Korrektheit bringen. Meine Lösung ist langsamer, funktioniert aber mit einer beliebigen Anzahl von Dateien, mit beliebigen Symbolen in Dateinamen, und Sie können sie normal mit sudo ausführen (achten Sie jedoch darauf, dass mit sudo möglicherweise andere Dateien erkannt werden).
quelle
Probieren Sie dieses Python-Skript aus. Es erfordert kein Spawnen von Prozessen und führt nur zwei Systemaufrufe pro Datei aus. Abgesehen von einer Implementierung in C wird dies wahrscheinlich der schnellste Weg sein (ich brauchte ihn, um ein Dateisystem mit 15 Millionen Dateien zu reparieren, die alle auf 777 gesetzt waren).
In meinem Fall war um das letzte chmod ein try / catch erforderlich, da das chmodding einiger spezieller Dateien fehlgeschlagen ist.
quelle
Sie können auch verwenden
tree
:und wenn Sie auch den Ordner anzeigen möchten, fügen Sie ein Echo hinzu
quelle
xargs
Themen informieren. Einfache Anführungszeichen in Dateinamen sind selbst ein Problem für viele Befehle und Skripte, deshalb habe ich alle Dateien mit einfachen Anführungszeichen aufgelistet und entfernt (die Anführungszeichen meine ich)Sie können das folgende Bash-Skript als Beispiel verwenden. Stellen Sie sicher, dass Sie ihm ausführbare Berechtigungen erteilen (755). Verwenden Sie einfach ./autochmod.sh für das aktuelle Verzeichnis oder ./autochmod.sh <dir>, um ein anderes Verzeichnis anzugeben.
quelle
$1
nicht null ist, sondern nicht der Name eines Verzeichnisses (z. B. ein Tippfehler),dir
wird.
ohne Meldung auf gesetzt. (2)$1
sollte"$1"
und$dir
sollte sein"$dir"
. (3) Sie brauchen nicht zu sagen"./"
;"."
ist in Ordnung (und genau genommen brauchen Sie hier keine Anführungszeichen). (4) Dies ist keine rekursive Lösung. (5) Ruft auf meinem Systemls -l … | awk '{ print $8 }'
die Änderungszeiten der Dateien ab. Sie müssen{ print $9 }
bekommen , das erste Wort von dem Dateinamen. Und selbst dann (6) behandelt dies keine Dateinamen mit Leerzeichen. …chmod
selbst auf 644 gesetzt, wodurch es selbst nicht ausführbar wird!