Когда я использую
find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt"
он находит все типы файлов. Но когда я добавлю -exec
в конце:
find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt" -exec sh -c 'echo "$0"' {} \;
кажется, он печатает только .txt
файлы. Что я делаю неправильно?
Примечание: используя MINGW (Git Bash)
*.js*
или*.txt
.Ответы:
это сокращение от:
То есть, поскольку предикат действия не указан (только условия ),
-print
действие неявно добавляется для файлов, соответствующих условиям.(и, кстати, что бы печатать нестандартные
.js
файлы (это-type f
касается только.htm
файлов)).Пока:
это сокращение от:
Поскольку
find
(как и во многих языках), AND (-a
; неявное, если не указано ) имеет приоритет над OR (-o
), а добавление явного предиката действия (здесь-exec
) отменяет-print
неявное действие, замеченное выше. Здесь вы хотите:Или же:
Чтобы избежать запуска по одному
sh
на файл.источник
Это подразумеваемые скобки. Добавьте явные скобки.
\(
\)
или используя xargs (мне нравится xargs, мне проще, но, видимо, не так портативно).
источник