Ответ 1
Попробуйте это
find /path/to/jpgs -type f -exec sh -c 'jhead -v {} | grep 123' \; -print
В качестве альтернативы вы можете попытаться встроить инструкцию exec в sh script, а затем выполните:
find -exec some_script {} \;
Я пытаюсь построить команду find для обработки кучи файлов в каталоге с использованием двух разных исполняемых файлов. К сожалению, -exec
on find не позволяет использовать pipe или даже \|
, потому что оболочка сначала интерпретирует этот символ.
Вот конкретно, что я пытаюсь сделать (что не работает, потому что pipe завершает команду find):
find /path/to/jpgs -type f -exec jhead -v {} | grep 123 \; -print
Попробуйте это
find /path/to/jpgs -type f -exec sh -c 'jhead -v {} | grep 123' \; -print
В качестве альтернативы вы можете попытаться встроить инструкцию exec в sh script, а затем выполните:
find -exec some_script {} \;
Несколько иной подход заключается в использовании xargs:
find /path/to/jpgs -type f -print0 | xargs -0 jhead -v | grep 123
который мне всегда было немного легче понять и адаптировать (аргументы -print0 и -0 необходимы, чтобы справляться с именами файлов, содержащими пробелы)
Это может быть (не проверено) более эффективно, чем использование -exec, потому что оно будет передавать список файлов в xargs, а xargs гарантирует, что команда jhead не будет слишком длинной.
С -exec
вы можете запускать только один исполняемый файл с некоторыми аргументами, а не с произвольными командами оболочки. Чтобы обойти это, вы можете использовать sh -c '<shell command>'
.
Обратите внимание, что использование -exec
довольно неэффективно. Для каждого найденного файла команда должна быть выполнена снова. Было бы более эффективно, если бы вы могли избежать этого. (Например, перемещая grep
вне -exec
или проводя результаты с find
до xargs
, как предложено Palmin.)
Использование команды find
для этого типа задачи, возможно, не самая лучшая альтернатива. Я часто использую следующую команду для поиска файлов, содержащих запрошенную информацию:
for i in dist/*.jar; do echo ">> $i"; jar -tf "$i" | grep BeanException; done
Поскольку это выводит список, вы не должны:
find /path/to/jpgs -type f -exec jhead -v {} \; | grep 123
или
find /path/to/jpgs -type f -print -exec jhead -v {} \; | grep 123
Поместите свой grep на результаты поиска -exec.