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 -printação é incluída implicitamente para os arquivos que correspondem às condições.
(e, a propósito, isso imprimiria .jsarquivos não regulares (o -type fúnico se aplica a .htmarquivos)).
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 -printaçã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 shpor arquivo.
*.js*ou*.txt.