находить . -тип 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
.