Wie kann ich Datei- und Verzeichnisberechtigungen auf einmal über SSH ändern?

924
SebinNyshkim

Ich versuche zu verwenden, findin Verbindung mit diesen -execund chmodrekursiv die Berechtigungen für jeden innerhalb eines Ordners über SSH Dateien und Verzeichnisse zu ändern.

Ich möchte diese beiden Befehle in einer Zeile ausführen:

find /share/Multimedia/ -type f -exec chmod 644 {} \; find /share/Multimedia/ -type d -exec chmod 755 {} \; 

Ich konnte vor einiger Zeit eine Lösung finden, die jemand anderes veröffentlicht hat, und aus irgendeinem Grund wurde mein Bash-Befehlsverlauf gelöscht, und ich habe die von mir an anderer Stelle verwendete Syntax nicht als Referenz notiert. Ich mache das nicht oft, deshalb bin ich mit Standard-Unix-Befehlen nicht zu geschickt.

Ich benutzte etwas in der Art von:

# probably won't execute find /share/Multimedia/ ( if -type f -exec chmod 644 {} \; else if -type d -exec chmod 755 {} \; ) 

Ich möchte dies nur gelegentlich auf meinem NAS ausführen, um die Berechtigungen auf einmal zu normalisieren, möglicherweise unbeaufsichtigt, um in der Zwischenzeit etwas anderes zu tun, während mein NAS es verarbeitet.

0

2 Antworten auf die Frage

2
Suicideboy

Zunächst einmal ifist es ein Schlüsselwort für die Shell, nicht für die Suche. Sie können es nicht als Option verwenden.

Zweitens suchen Sie wahrscheinlich nach so etwas:

find /share/Multimedia/ -exec sh -c 'if [ -f {} ]; then chmod 644 {}; else chmod 755 {}; fi' \; 

Wir prüfen nur, ob das Element eine Datei mit unserer Shell ist, und if [ -f {} ]dann chmod, wie Sie es für eine Datei oder ein Verzeichnis wollten.

1
Gordon Davisson

Sie können die und-oder-Struktur des findAusdruckssystems dazu nutzen:

find /share/Multimedia/ -type f -exec chmod 644 {} \; -o -type d -exec chmod 755 {} \; 

Dies hat im Wesentlichen die folgende Logik:

IF: the item is a plain file AND the chmod 644 command succeeds on it OR the item is a directory AND the chmod 755 command succeeds on it THEN ... well, do nothing; normally it'd print the item's path, but since there's a -exec in the expression, that gets skipped 

Es gibt jedoch einen wesentlich einfacheren Weg:

chmod -R u=rwX,go=rX /share/Multimedia/ 

Dies nutzt die chmodBerechtigung "X", was "Ausführen" bedeutet, aber nur, wenn es sinnvoll ist. Meistens bedeutet dies, dass es für Verzeichnisse ausgeführt wird, nicht jedoch für einfache Dateien. Das hauptsächliche potenzielle Problem besteht darin, dass wenn eine Ausführungsberechtigung für eine einfache Datei angezeigt wird, es beabsichtigt ist und beibehalten wird, so dass diese nicht bereinigt wird, nachdem jemand alles durchlaufen hat und Ausführungsberechtigung zugewiesen hat.

Das ist eine Art Sache, mein NAS legt willkürliche Berechtigungen für neue Dateien fest, und ich möchte sie normalisieren, um die Berechtigungen für Dateien und Verzeichnisse zu schätzen. Danke für die ausführliche Erklärung. Ich denke, der erste war, wonach ich gesucht hatte :) SebinNyshkim vor 7 Jahren 0