находить . -тип f -name "* .htm *" -o -name "* .js *" -o -name "* .txt"
это сокращение от:
находить . \ (\ ( -type f -a -name "* .htm *" \) -o \
\ ( -name "* .js *" \) -o \
\ ( -name "* .txt" \) \
\) -a -принт
То есть, поскольку предикат действия не указан (только условия ), -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.