Esta es una limitación de find
. El estándar POSIX especifica que el estado de la devolución de find
es 0 a menos que se produjo un error al atravesar los directorios; el estado de la devolución de comandos ejecutados no entrar en él.
Usted puede hacer los comandos de escritura de su estado a un archivo o a un descriptor de:
find_status_file=$(mktemp findstatus)
: >"$find_status_file"
find … -exec sh -c 'trap "echo \$?" EXIT; invalid_command "$0"' {} \;
if [ -s "$find_status_file" ]; then
echo 1>&2 "An error occurred"
fi
rm -f "$find_status_file"
Otro método, como se descubrió, es el uso de xargs. El xargs
comandos siempre procesa todos los archivos, pero devuelve el estado 1 si alguno de los comandos devuelve un valor distinto de cero de estado.
find … -print0 | xargs -0 -n1 invalid_command
Otro método es para evadir find
y el uso recursivo de esta expansión en el shell lugar: **/
significa cualquier profundidad de los subdirectorios. Esto requiere la versión 4 o superior de bash. Uso set -e
para detener la secuencia de comandos en el primer comando devuelve un valor distinto de cero de estado.
shopt -s globstar
set -e
for x in **/*.xml; do invalid_command "$x"; done