знайти. -тип f -name "* .htm *" -o -name "* .js *" -o -name "* .txt"
скорочено:
знайти. \ (\ ( -тип f -a- ім'я "* .htm *" \) -o \
\ ( -name "* .js *" \) -o \
\ ( -ім'я "* .txt" \) \
\) -а -друк
Тобто, оскільки не вказаний предикат дії (лише умови ), -printдія неявно додається для файлів, які відповідають умовам.
(і, до речі, це друкувало б нестандартні .jsфайли ( -type fстосується лише .htmфайлів)).
Поки:
знайти. -тип f -name "* .htm *" -o -name "* .js *" -o -name "* .txt" \
-exec sh -c 'echo "$ 0"' {} \;
скорочено:
знайти. \ ( -тип f -a -name "* .htm *" \) -o \
\ ( -name "* .js *" \) -o \
\ ( -name "* .txt" -a -exec sh -c 'echo "$ 0"' {} \; \)
Для find(як у багатьох мовах) AND ( -a; неявна, якщо пропущено) має перевагу над OR ( -o), а додавання явного предиката дії (тут -exec) скасовує -printнеявну дію, бачену вище. Тут ви хочете:
find . -type f \( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" \) \
-exec sh -c 'echo "$0"' {} \;
Або:
find . -type f \( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" \) -exec sh -c '
for i do
echo "$i"
done' sh {} +
Щоб уникнути запуску одного shфайлу.
*.js*або*.txt.