Wie kann ich eine bestimmte Liste von Dateien chmod / chown?

31

Ich möchte ein .sh-Skript schreiben, um einige Ordnerberechtigungen einzurichten, habe mich aber gefragt, ob ich Folgendes ausführen kann:

chown -644 ./one;/two;/three

um eine Liste von Ordnern anzuzeigen, anstatt chown mehrmals aufzurufen.

Gibt es auch eine Möglichkeit, eine Liste von Dateien anzuzeigen und andere auszuschließen, wie zum Beispiel:

chown -R -664 ./*;!./cache

Ich hoffe, meine Pseudo-Kommandozeilen machen Sinn.

josef.van.niekerk
quelle

Antworten:

43

Fast alle Unix-Tools akzeptieren eine Liste von Dateien als Nichtoptionsargumente. Wie üblich müssen die verschiedenen Argumente durch Leerzeichen getrennt werden:

chown 644 one two three

Wenn Sie in Ihrem zweiten Beispiel Bash verwenden, ist dies ein einfaches Beispiel

chown -R 644 !(cache)

wird genug sein.

Dieser Ansatz erfordert einen erweiterten Musterabgleich. Wenn es deaktiviert ist, können Sie es mit aktivieren

shopt -s extglob

Siehe: Bash-Referenzhandbuch # Pattern Matching

Dennis
quelle
4

Erstellen Sie eine Liste der Dateinamen in mod-these.txt und führen Sie dann Folgendes aus:

chmod g+w `cat mod-these.txt`

oder verwenden Sie die hier von anderen beschriebene Methode:

chown 644 one two three

Oder gehen Sie mit der ersten Option in die Stadt, aber ändern Sie jede Zeile in der Datei (in diesem Beispiel: Ersetzen Sie "/" (mit Leerzeichen zuvor) durch "./"):

chmod g+w `sed 's/ \// .\//' update-writable.txt` 
Chonez
quelle
2

Regex für den Sieg!

Die Verwendung von find ist die beste Möglichkeit, die ich mir vorstellen kann, außerhalb der Verwendung der regulären Ausdrücke, die möglicherweise bereits in Ihrer speziellen Shell oder in der App, die Sie selbst verwenden, vorhanden sind. Zuerst habe ich versucht:

touch one&touch two &touch three&find -name "one|two|three" -exec chown -644 {} \;

Sie werden jedoch feststellen, dass die Pipe in diesem Fall nicht funktioniert. Eine andere traurige Sache zu lernen ... wie das Lernen von chmod, chown, chgrp, et. al. Multi-File / Regex-Auswahl / Ausschluss selbst wird nicht unterstützt ...
Die gefundene Lösung:
/programming/19111067/regex-match-either-string-in-linux-find-command

find \( -name one -o -name two -o -name three \) -exec chown -644 {} \;

Also, nicht so viel Regex für den Gewinn, aber zumindest haben wir eine Möglichkeit, eine Liste von Dateien in die Argumente eines Programms in einer Zeile einzufügen.

Sie werden bemerken, dass Sie die () Meta-Zeichen und den -o-Parameter für jeden weiteren Namen maskieren müssen ...

andere links und inhalte von mir, die dich auf deiner reise interessieren könnten:
verschiedene leckerbissen - notizen von korn bourne und freunden. - Dave Horners Website

Prost.
- Dave

Dave Horner
quelle
KISS gewinne, halte es einfach und dumm! Keine Notwendigkeit für komplexe Dinge, die immer noch sauber und einfach sein können.
Al-Mothafar,
2

Wenn sich die zu ändernden Dateien in einem Verzeichnis befinden, können Sie sie mit dem erforderlichen Muster versehen.

Ich muss zB alle heruntergeladenen .run-Dateien in pwd auf ausführbar ändern:

chmod +x `ls *.run`
gat1
quelle