encontrar . -type f -name "* .htm *" -o -name "* .js *" -o -name "* .txt"
é a abreviação de:
encontrar . \ (\ ( -type f -a -name "* .htm *" \) -o \
\ ( -name "* .js *" \) -o \
\ ( -name "* .txt" \) \
\) -uma impressão
Ou seja, como nenhum predicado de ação é especificado (apenas condições ), uma -print
ação é incluída implicitamente para os arquivos que correspondem às condições.
(e, a propósito, isso imprimiria .js
arquivos não regulares (o -type f
único se aplica a .htm
arquivos)).
Enquanto:
encontrar . -type f -name "* .htm *" -o -name "* .js *" -o -name "* .txt" \
-exec sh -c 'echo "$ 0"' {} \;
é a abreviação de:
encontrar . \ ( -tipo f -a -name "* .htm *" \) -o \
\ ( -name "* .js *" \) -o \
\ ( -name "* .txt" -a -exec sh -c 'echo "$ 0"' {} \; \)
Para find
(como em muitos idiomas), AND ( -a
; implícito quando omitido) tem precedência sobre OR ( -o
), e adicionar um predicado de ação explícito (aqui -exec
) cancela a -print
ação implícita vista acima. Aqui você quer:
find . -type f \( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" \) \
-exec sh -c 'echo "$0"' {} \;
Ou:
find . -type f \( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" \) -exec sh -c '
for i do
echo "$i"
done' sh {} +
Para evitar a execução de um sh
por arquivo.
*.js*
ou*.txt
.