Ich möchte die 755-Berechtigung für alle Dateien und Unterverzeichnisse in einem bestimmten Verzeichnis festlegen, aber ich möchte chmod 755 nur für diejenigen Komponenten ausführen, die keine 755-Berechtigung haben.
find /main_directory/ -exec chmod 755 {} \;
Wenn der find
Befehl eine lange Liste zurückgibt, nimmt dies viel Zeit in Anspruch. Ich weiß, dass ich den Befehl stat verwenden kann, um die Octal-Dateiebenenberechtigung jeder Komponente zu überprüfen und dann if-else zu verwenden, um die Dateiberechtigung umzuschalten. Gibt es jedoch einen einzeiligen Ansatz, der verwendet find
und xargs
zuerst überprüft, über welche Berechtigung die Datei / das Verzeichnis verfügt? , und verwenden Sie dann chmod
, um es in 755 zu ändern, wenn es auf etwas anderes eingestellt ist.
command-line
find
chmod
Kumarjit Ghosh
quelle
quelle
u+rw,go+r,go-w,ugo+X
- beachten Sie die Hauptstadt.Antworten:
Wenn Sie die Berechtigungen
755
sowohl für Dateien als auch für Verzeichnisse ändern möchten, bietet die Verwendungfind
(zumindest aus Sicht der Leistung) keinen wirklichen Vorteil , und Sie können dies einfach tunWenn Sie wirklich verwenden möchten, um
find
zu vermeiden, dass Berechtigungen für Dinge755
geändert werden , die bereits über Berechtigungen verfügen (um zu vermeiden, dass deren Zeitstempel aktualisiert wird), sollten Sie auch die aktuellen Berechtigungen für jedes Verzeichnis und jede Datei testen:Der
-exec ... {} +
sammelt so viele Pfadnamen wie möglich, die den! -perm 0755
Test bestehen, und führt siechmod
alle gleichzeitig aus.Normalerweise möchte man die Berechtigungen für Dateien und Verzeichnisse separat ändern, damit nicht alle Dateien ausführbar sind:
quelle
+
statt;
einen großen Unterschied macht.Wie
find
die-exec ... +
Syntax verstanden hat, macht es nicht viel Sinn, sie zu verwendenxargs
, aber wie Sie danach fragen:quelle
-0
(in Kombination mit-print0
in find; dies ist die GNU-Erweiterung) in Bezug auf die Sicherheit ziemlich problematisch sein kann, wenn potenzielle Angreifer Dateinamen erstellen können, die Leerzeichen oder andere Sonderzeichen enthalten. Also-exec
xargs
(nur verwenden-exec
), und wenn Sie es verwenden, sollten Sie verwenden-print0
/-0
wie Matija sagt.