¿Hay alguna manera de escribir un mensaje findpara que se rompa si una de las -execoperaciones falla en un archivo?
Por ejemplo ( javacse 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 execarchivo A.javafalló (y devolvió un código de salida de 1), el findcomando continuó y también compiló el archivo B.java. ¿Hay alguna manera de salir findo debería usar alguna forma de en su forlugar?
Mi versión de find:
$ find -version | head -1
find (GNU findutils) 4.4.2

$0?$0es el primer argumento parash -c($1es 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$0tiene sentido (por ejemplo, puede ver fácilmente enps). Hay una escuela de pensamiento (a la que obviamente no pertenezco) que establece que$0siempre debe ser ejecutable y que debe escribirsh -c 'cmd "$1" …' sh {}o algo así.find-sh$0al final de unafinddeclaració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.javafalla y, aún así, el archivo B.java se compila.Al menos con GNU
findpuedes 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 -quiten este caso) pero puede que no esté en ningún otro lado.-exec ... -o -quitno me funciona. No procesa ningún archivo. Sin embargo, esta línea funciona:find . -iname \*.java -not -exec javac '{}' \; -quit:-quitse llama si-execes falsa, es decir. devuelve con un valor distinto de cero.find . -iname \*.java -exec javac {} \; -o -quittampoco puede procesar ningún archivo. Curiosamente,find . -iname \* -exec echo 'foo' \; -o -quithace del "proceso" los archivos.Consulte su
findmanual. La respuesta de @ Hauke me motivó a mirar y el hallazgo de QNX tiene una-abortopción que parece similar a la-quitopción GNU . Funciona para mí siempre que use\(y\)para agrupar expresiones:Nota: sin los parens, aborta en el primer archivo.
fuente