Verwenden Sie den Befehl chmod selektiv

11

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 findBefehl 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 findund xargszuerst ü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.

Kumarjit Ghosh
quelle
6
Dies kann eine vorzeitige Optimierung sein und möglicherweise nicht einmal schneller. Wenn Sie all diese Überprüfungen durchführen, wird dies möglicherweise verlangsamt. Das Testen, um sicherzustellen, dass es schneller ist, zahlt sich nur aus, wenn Sie dies häufig tun müssen.
Strg-Alt-Delor
3
Sie möchten wahrscheinlich nicht allen Dateien Ausführungsberechtigungen erteilen. Dies schafft ein Sicherheitsrisiko. (Dies ist einer der Virenvektoren unter Microsoft Windows: Alles ist ausführbar). Im symbolischen Modus können Sie sagen u+rw,go+r,go-w,ugo+X- beachten Sie die Hauptstadt.
Strg-Alt-Delor
Ich stimme @ ctrl-alt-delor zu, würde aber etwas vorschlagen, das näher an dem liegt, was Sie gefragt haben: u = rwX, go = rX, das dasselbe erreichen sollte.
Pinguin359

Antworten:

21

Wenn Sie die Berechtigungen 755sowohl für Dateien als auch für Verzeichnisse ändern möchten, bietet die Verwendung find(zumindest aus Sicht der Leistung) keinen wirklichen Vorteil , und Sie können dies einfach tun

chmod -R 755 /main_directory

Wenn Sie wirklich verwenden möchten, um findzu vermeiden, dass Berechtigungen für Dinge 755geä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:

find /main_directory ! -perm 0755 -exec chmod 755 {} +

Der -exec ... {} +sammelt so viele Pfadnamen wie möglich, die den ! -perm 0755Test bestehen, und führt sie chmodalle gleichzeitig aus.

Normalerweise möchte man die Berechtigungen für Dateien und Verzeichnisse separat ändern, damit nicht alle Dateien ausführbar sind:

find /main_directory   -type d ! -perm 0755 -exec chmod 755 {} +
find /main_directory ! -type d ! -perm 0644 -exec chmod 644 {} +
Kusalananda
quelle
Arbeitete wie Charme, danke. Grüße, Kumarjit
Kumarjit Ghosh
1
Ich vermute, dass die Verwendung +statt ;einen großen Unterschied macht.
Kevin
Dies ist der schnelle Weg - vermeiden Sie eine Überprüfung. Ich würde weiterhin find verwenden, um eine Liste nur der Dateien zu erstellen, für die Sie die Berechtigung zum Ändern haben. Dadurch wird vermieden, dass chmod-Fehler bei Dateien auftreten, die nicht geändert werden können. <pre> <code> # rwx, rw, wx, w nur finden. -user $ (whoami) -perm / 002! -perm 0755 -exec chmod 0755 {} \; # in zwei Operationen aufteilen finden. -user $ (whoami) -perm / 002! -perm 0755> /tmp/chfiles.txt für Datei in $ (</ tmp / chfiles.txt) do chmod --quiet 0755 "$ {file}" erledigt </ code> </ pre>
Chris Reid
@ChrisReid Beachten Sie, dass das Durchlaufen einer Liste solcher Pfadnamen unterbrochen wird, wenn ein Pfadname ein Leerzeichen enthält.
Kusalananda
Ich denke, Sie müssen den internen Feldtrenner (IFS) in einem Skript in '\ n' ändern. Dies sind Umgebungseinstellungen. Die Art und Weise, wie die Shell sie interpretiert, hängt von den Werten dieser Einstellungen ab. Ich teste Skripte an Dummy-Dateien, bevor ich sie verwende, um fehlerhafte Verzerrungen wie das Umbenennen oder Überschreiben von Dateien zu ermitteln. Ich mag die Shell-Printf-Methode zum Einstellen von IFS. IFS = $ (printf "\ n") # sehr gut lesbar
Chris Reid
1

Wie finddie -exec ... +Syntax verstanden hat, macht es nicht viel Sinn, sie zu verwenden xargs, aber wie Sie danach fragen:

find /main_directory -not -perm 0755 | xargs chmod 755
Henrik unterstützt die Community
quelle
1
Beachten Sie auch, dass xargs ohne -0(in Kombination mit -print0in 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
Matija Nalis
Keine Notwendigkeit für xargs(nur verwenden -exec), und wenn Sie es verwenden, sollten Sie verwenden -print0/ -0wie Matija sagt.
Kevin