encontrar . -type f -name "* .htm *" -o -name "* .js *" -o -name "* .txt"
es la abreviatura de:
encontrar . \ (\ ( -type f -a -name "* .htm *" \) -o \
\ ( -name "* .js *" \) -o \
\ ( -name "* .txt" \) \
\) -una impresión
Es decir, dado que no se especifica un predicado de acción (solo condiciones ), -print
se agrega implícitamente una acción para los archivos que coinciden con las condiciones.
(y, por cierto, eso imprimiría .js
archivos no regulares ( -type f
solo se aplica a los .htm
archivos)).
Mientras:
encontrar . -type f -name "* .htm *" -o -name "* .js *" -o -name "* .txt" \
-exec sh -c 'echo "$ 0"' {} \;
es la abreviatura de:
encontrar . \ ( -type f -a -name "* .htm *" \) -o \
\ ( -name "* .js *" \) -o \
\ ( -name "* .txt" -a -exec sh -c 'echo "$ 0"' {} \; \)
Para find
(como en muchos idiomas), AND ( -a
; implícito cuando se omite) tiene prioridad sobre OR ( -o
), y agregar un predicado de acción explícito (aquí -exec
) cancela la -print
acción implícita vista anteriormente. Aquí 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 uno sh
por archivo.
*.js*
o*.txt
.