Gibt es eine Möglichkeit, ein find
so zu schreiben , dass es abbricht, wenn eine der -exec
Operationen für eine Datei fehlschlägt?
ZB ( javac
wird praktischerweise als Programm verwendet, das für einige Dateien und aus keinem anderen Grund einen Exit-Code von 1 zurückgeben kann):
$ echo "public classXX A{}" >> A.java
$ echo "public class B{}" >> B.java
$ find . -iname \*.java -exec javac {} \;
./A.java:1: error: class, interface, or enum expected
public classXX A{}
^
1 error
In dem obigen Beispiel, obwohl die exec
auf der Datei A.java
fehlgeschlagen (und zurück einen Exit - Code von 1), der find
Befehl fort und Datei kompilierte B.java
sowie. Gibt es eine Möglichkeit auszubrechen find
oder sollte ich for
stattdessen irgendeine Form von verwenden?
Meine Version von find:
$ find -version | head -1
find (GNU findutils) 4.4.2
$0
?$0
ist das erste Argument fürsh -c
($1
ist das zweite usw.) - üblicherweise der Name des ausgeführten Programms, aber hier führen Sie ein Snippet aus und übergeben den Dateinamen, der verarbeitet wird, als$0
sinnvoll (z. B. als leicht erkennbar) es inps
). Es gibt eine Denkschule (der ich offensichtlich nicht angehöre), die besagt, dass$0
sie immer ausführbar sein sollte und Sie sollten schreibensh -c 'cmd "$1" …' sh {}
oder so.find-sh
$0
am Ende einerfind
Erklärung ein angefügt hatte . Dies scheint meiner Meinung nach nützlicher zu sein, obwohl es auf lange Sicht am wichtigsten ist, wonach Sie suchen.find . -iname \*.java -exec sh -c 'javac "${0}" || kill '$$ {} \;
DateiA.java
fehlgeschlagen ist und die Datei B.java trotzdem kompiliert wird.Zumindest mit GNU können
find
Sie verwenden:quelle
find . -iname \*.java -exec javac {} -o -quit \;
undfind . -iname \*.java -exec javac {} \; -o -quit \;
scheitern (auf unterschiedliche Weise)\;
wird am und vom-exec
(dh vorher-o -quit
in diesem Fall) benötigt, kann aber nirgendwo anders sein.-exec ... -o -quit
funktioniert bei mir nicht. Es werden keine Dateien verarbeitet. Doch diese Linie funktioniert:find . -iname \*.java -not -exec javac '{}' \; -quit
:-quit
wird aufgerufen , wenn-exec
falsch ist , dh. Gibt mit einem Wert ungleich Null zurück.find . -iname \*.java -exec javac {} \; -o -quit
Auch kann keine Dateien verarbeiten. Merkwürdigerweisefind . -iname \* -exec echo 'foo' \; -o -quit
hat „Prozess“ , die Dateien.Konsultieren Sie Ihr
find
Handbuch. @ Haukes Antwort hat mich motiviert zu schauen und QNXs Entdeckung hat eine-abort
Option, die der GNU--quit
Option ähnlich zu sein scheint . Es funktioniert für mich, vorausgesetzt, ich verwende\(
und\)
gruppiere Ausdrücke:Hinweis: Ohne die Parens wird die erste Datei abgebrochen.
quelle