62 votos

Cómo debo hacer para encontrar un error si -exec no puede?

Al ejecutar este comando en el shell (en un directorio que no esté vacío):

find . -exec invalid_command_here {} \;

Me sale esto:

find: invalid_command_here: No such file or directory
find: invalid_command_here: No such file or directory
find: invalid_command_here: No such file or directory

(y así sucesivamente para cada archivo)

Necesito find a fallar después de que el primer error. Hay alguna manera de conseguir que esto funcione? No puedo usar xargs, como he espacios en mi camino, pero necesito el script de llamar a esta devolver un código de error.

54voto

staffan Puntos 3299

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

26voto

Robert Puntos 61

Puedo usar esto en su lugar:

find . -name *.xml -print0 | xargs -n 1 -0 invalid_command

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X