Existe-t-il un moyen d'écrire un find
afin qu'il se casse si l'une des -exec
opérations échoue sur un fichier?
Par exemple ( javac
est commodément utilisé comme un programme qui peut retourner un code de sortie de 1 sur certains fichiers et pour aucune autre raison):
$ 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
Dans l'exemple ci-dessus, bien que le exec
fichier ait A.java
échoué (et renvoyé un code de sortie de 1), la find
commande a également exécuté et compilé le fichier B.java
. Existe-t-il un moyen de sortir find
ou dois-je utiliser une forme quelconque à la for
place?
Ma version de find:
$ find -version | head -1
find (GNU findutils) 4.4.2
$0
il?$0
est le premier argument desh -c
($1
est le deuxième, etc.) - conventionnellement le nom du programme en cours d'exécution, mais ici vous exécutez un extrait de code, et le passage du nom de fichier en cours de traitement$0
est logique (par exemple, vous voyez facilement enps
). Il y a une école de pensée (à laquelle je n'appartiens évidemment pas) qui déclare qu'il$0
devrait toujours être exécutable et que vous devriez écriresh -c 'cmd "$1" …' sh {}
ou quelque chose du genre.find-sh
$0
à la fin d'unefind
déclaration. Cela semble plus utile à mon avis, même si je suppose que c'est ce que vous recherchez à long terme qui compte le plus.find . -iname \*.java -exec sh -c 'javac "${0}" || kill '$$ {} \;
fichierA.java
et toujours le fichier B.java est compilé.Au moins avec GNU,
find
vous pouvez utiliser:la source
find . -iname \*.java -exec javac {} -o -quit \;
etfind . -iname \*.java -exec javac {} \; -o -quit \;
échouent (de différentes manières)\;
est nécessaire au et de-exec
(c'est-à-dire avant-o -quit
dans ce cas) mais peut être nulle part ailleurs.-exec ... -o -quit
ne fonctionne pas pour moi. Il ne traite aucun fichier. Cependant cette ligne fonctionne:find . -iname \*.java -not -exec javac '{}' \; -quit
:-quit
est appelée si-exec
est fausse, à savoir. renvoie avec non nul.find . -iname \*.java -exec javac {} \; -o -quit
échoue également à traiter les fichiers. Étrangement, lefind . -iname \* -exec echo 'foo' \; -o -quit
fait de « processus » les fichiers.Consultez votre
find
manuel. @ La réponse de Hauke m'a motivé à regarder et la recherche de QNX a une-abort
option qui semble similaire à l'-quit
option GNU . Cela fonctionne pour moi à condition d'utiliser\(
et\)
de regrouper les expressions:Remarque: sans les parens, il s'interrompt sur le premier fichier.
la source