¿Hay alguna manera de escribir un mensaje find
para que se rompa si una de las -exec
operaciones falla en un archivo?
Por ejemplo ( javac
se usa convenientemente como un programa que puede devolver un código de salida de 1 en algunos archivos y sin ningún otro motivo):
$ 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
En el ejemplo anterior, aunque el exec
archivo A.java
falló (y devolvió un código de salida de 1), el find
comando continuó y también compiló el archivo B.java
. ¿Hay alguna manera de salir find
o debería usar alguna forma de en su for
lugar?
Mi versión de find:
$ find -version | head -1
find (GNU findutils) 4.4.2
$0
?$0
es el primer argumento parash -c
($1
es el segundo, etc.): convencionalmente el nombre del programa que se está ejecutando, pero aquí está ejecutando un fragmento, y pasar el nombre del archivo que se está procesando$0
tiene sentido (por ejemplo, puede ver fácilmente enps
). Hay una escuela de pensamiento (a la que obviamente no pertenezco) que establece que$0
siempre debe ser ejecutable y que debe escribirsh -c 'cmd "$1" …' sh {}
o algo así.find-sh
$0
al final de unafind
declaración. Esto parece más útil en mi opinión, aunque creo que es lo que buscas a largo plazo lo que más importa.find . -iname \*.java -exec sh -c 'javac "${0}" || kill '$$ {} \;
archivoA.java
falla y, aún así, el archivo B.java se compila.Al menos con GNU
find
puedes usar:fuente
find . -iname \*.java -exec javac {} -o -quit \;
yfind . -iname \*.java -exec javac {} \; -o -quit \;
fallan (de diferentes maneras)\;
es necesario en el y de-exec
(es decir, antes-o -quit
en este caso) pero puede que no esté en ningún otro lado.-exec ... -o -quit
no me funciona. No procesa ningún archivo. Sin embargo, esta línea funciona:find . -iname \*.java -not -exec javac '{}' \; -quit
:-quit
se llama si-exec
es falsa, es decir. devuelve con un valor distinto de cero.find . -iname \*.java -exec javac {} \; -o -quit
tampoco puede procesar ningún archivo. Curiosamente,find . -iname \* -exec echo 'foo' \; -o -quit
hace del "proceso" los archivos.Consulte su
find
manual. La respuesta de @ Hauke me motivó a mirar y el hallazgo de QNX tiene una-abort
opción que parece similar a la-quit
opción GNU . Funciona para mí siempre que use\(
y\)
para agrupar expresiones:Nota: sin los parens, aborta en el primer archivo.
fuente