Cuando estoy usando
find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt"
encuentra todos los tipos de archivo. Pero cuando agrego -exec
al final:
find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt" -exec sh -c 'echo "$0"' {} ;
parece que solo imprime .txt
archivos ¿Qué estoy haciendo mal?
Nota:usando MINGW (Git Bash)
Respuesta aceptada:
find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt"
es la abreviatura de:
find . ( ( -type f -a -name "*.htm*" ) -o ( -name "*.js*" ) -o ( -name "*.txt" ) ) -a -print
Es decir, porque ninguna acción se especifica el predicado (solo condiciones ), un -print
la acción se agrega implícitamente para los archivos que coinciden con las condiciones.
(y, por cierto, eso imprimiría un .js
no regular archivos (el -type f
solo se aplica a .htm
archivos)).
Mientras:
find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt" -exec sh -c 'echo "$0"' {} ;
es la abreviatura de:
find . ( -type f -a -name "*.htm*" ) -o ( -name "*.js*" ) -o ( -name "*.txt" -a -exec sh -c 'echo "$0"' {} ; )
Para find
(como en muchos idiomas), Y (-a
; implícito cuando se omite) tiene prioridad sobre OR (-o
), y agregar un predicado de acción explícito (aquí -exec
) cancela el -print
acción implícita vista arriba. Toma, quieres:
find . -type f ( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" )
-exec sh -c 'echo "$0"' {} ;
O:
find . -type f ( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" ) -exec sh -c '
for i do
echo "$i"
done' sh {} +
Para evitar ejecutar un sh
por archivo.