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.