Für den find
Befehl können Sie auch einfach mehrere -exec
Befehle hintereinander hinzufügen :
find . -name "*" -exec chgrp -v new_group '{}' \; -exec chmod -v 770 '{}' \;
Beachten Sie, dass dieser Befehl in seinem Ergebnis der Verwendung entspricht
chgrp -v neue_gruppendatei && chmod -v 770 datei
auf jeder Datei.
Alle die find
‚s Parameter wie -name
, -exec
, -size
und so weiter, sind tatsächlich testet : find
weiterhin einen nach dem anderen , so lange laufen , wie die gesamte Kette bisher bewertet wurde wahr . Daher wird jeder nachfolgende -exec
Befehl nur ausgeführt , wenn die vorherigen true zurückgegeben haben (dh den 0
Status der Befehle verlassen). Versteht aber find
auch logische Operatoren wie oder ( -o
) und nicht ( !
). Um eine -exec
Testkette unabhängig von den vorherigen Ergebnissen zu verwenden, müsste man also etwa Folgendes verwenden:
find . -name "*" \( -exec chgrp -v new_group {} \; -o -exec chmod -v 770 {} \; \)
'{}'
(Apostrophe um die Klammern), besuchen Sie bitte: unix.stackexchange.com/q/8647/4485quelle
-c
seltsamen Handhabung von 0 $ lassen mich denken, dass dies jedes Mal falsch ist, wenn ich es mir anschaue , aber es ist definitiv richtig.sh -c
.Ihr Befehl wird zuerst von der Shell in zwei durch
;
ein Trennzeichen getrennte Befehle zerlegt, was einer neuen Zeile entspricht:Wenn Sie einen Shell-Befehl ausführen möchten, rufen Sie eine Shell explizit mit auf
bash -c
(odersh -c
wenn es Ihnen egal ist, dass die Shell speziell bash ist):Beachten Sie die Verwendung von
{}
als Argument für die Shell. Es ist das nullte Argument (normalerweise der Name der Shell oder des Skripts, aber das spielt hier keine Rolle)"$0"
.Sie können mehrere Dateinamen gleichzeitig an die Shell übergeben und die Shell durchlaufen lassen. Dies ist schneller. Hier übergebe ich
_
als Skriptnamen und die folgenden Argumente sind Dateinamen, über diefor x
(eine Abkürzung fürfor x in "$@"
) iteriert wird.Beachten Sie, dass Sie seit Bash 4 oder in zsh hier nichts mehr finden müssen. Führen
shopt -s globstar
Sie in bash den Befehl aus (fügen Sie ihn in Ihren Ordner ein~/.bashrc
), um das**/
Stehen für ein rekursives Verzeichnis glob zu aktivieren . (In zsh ist dies die ganze Zeit aktiv.) Dannoder wenn Sie möchten, dass die Dateien der Reihe nach durchlaufen werden
Ein Unterschied zum
find
Befehl besteht darin, dass die Shell Punktdateien (Dateien, deren Name mit a beginnt.
) ignoriert . Um sie in die Bash aufzunehmen, setzen Sie zuerstGLOBIGNORE=.:..
; Verwenden Sie in zsh**/*(D)
als Glob-Muster.quelle
sh -c
.