In dieser Demonstration verwende ich sh -c 'echo first; false'
(oder true
) für die ersten -exec
. Das gibt etwas Ausgabe und hat auch den ausgewählten Exit-Code-Effekt. Dann echo second
wird für den zweiten verwendet. Angenommen, es gibt eine Datei im aktuellen Verzeichnis.
$ find . -type f -exec sh -c 'echo first; false' \; -exec echo second \;
first
$ find . -type f -exec sh -c 'echo first; true' \; -exec echo second \;
first
second
$ find . -type f \( -exec sh -c 'echo first; false' \; -false -o -exec echo second \; \)
first
second
$ find . -type f \( -exec sh -c 'echo first; false' \; -false -o -exec echo second \; \)
first
second
Ein echter Befehl dieses Typs würde wie folgt aussehen:
find . -type f \( -exec command1 \; -false -o -exec command2 \; \)
Im zweiten Satz gruppieren die Klammern mit Escapezeichen die beiden -exec
Klauseln. Die -false
zwischen ihnen zwingt den Teststatus auf "false" und den -o
bewirkt den nächsten Ausdruck (das zweite -exec
) wegen -false
ausgewertet werden .
Ab man find
:
Ausdruck1 Ausdruck2
Zwei aufeinanderfolgende Ausdrücke werden mit einem implizierten "und" verbunden; expr2 wird nicht ausgewertet, wenn expr1 falsch ist.
Ausdruck1 -ein Ausdruck2
Dasselbe wie expr1 expr2.
Ausdruck1 -o Ausdruck2
Oder; expr2 wird nicht ausgewertet, wenn expr1 wahr ist.
Wenn es Ihnen egal ist, dass cmd1 aufgrund des Fehlercodes 0
verhindern kann, dass cmd2 ausgeführt wird :
find . -exec cmd1 \; -exec cmd2 \;
Der einzig zuverlässige Weg, beide Befehle dazu zu bringen, dies immer auszuführen, ist find
Rufen Sie eine Shell auf, die anschließend die Befehle der Reihe nach ausführt:
find . -exec bash -c 'cmd1; cmd2' filedumper {} \;
Wenn es Ihnen nichts ausmacht, ein Skript zu erstellen, das cmd1 und cmd2 ausführt, dann ist es nur das:
find . -exec myscript {} \;
oder
find . -exec myscript {} +
Verwenden \; oder +, je nachdem, ob myscript mehr als eine Datei gleichzeitig verarbeiten kann (wird haarig, wenn Leerzeichen in Dateinamen usw. vorkommen).
Meiner Erfahrung nach hat es sich fast immer gelohnt, das, was Sie getan haben, in ein Drehbuch zu schreiben. Wenn Sie es einmal tun müssen, müssen Sie es erneut tun.
Aber ein netter Trick besteht darin, den Fund innerhalb zu platzieren das Skript:
if [ $# -gt 0 ]; then
for each; do
touch $each
done
else
find . -exec $0 {} +
fi
Dann arbeitet myscript an allen Dateien, die Sie als Argumente für die Arbeit angeben, aber wenn Sie ihm keine Argumente geben, führt es find aus dem aktuellen Verzeichnis aus und ruft sich dann selbst für die gefundenen Dateien auf. Dies umgeht die Tatsache, dass find -exec keine Shell-Funktionen aufrufen kann, die Sie in Ihrem Skript definiert haben.