Подтвердить что ты не робот

Как использовать трубку в параметре exec для команды find?

Я пытаюсь построить команду find для обработки кучи файлов в каталоге с использованием двух разных исполняемых файлов. К сожалению, -exec on find не позволяет использовать pipe или даже \|, потому что оболочка сначала интерпретирует этот символ.

Вот конкретно, что я пытаюсь сделать (что не работает, потому что pipe завершает команду find):

find /path/to/jpgs -type f -exec jhead -v {} | grep 123 \; -print
4b9b3361

Ответ 1

Попробуйте это

find /path/to/jpgs -type f -exec sh -c 'jhead -v {} | grep 123' \; -print

В качестве альтернативы вы можете попытаться встроить инструкцию exec в sh script, а затем выполните:

find -exec some_script {} \;

Ответ 2

Несколько иной подход заключается в использовании xargs:

find /path/to/jpgs -type f -print0 | xargs -0 jhead -v | grep 123

который мне всегда было немного легче понять и адаптировать (аргументы -print0 и -0 необходимы, чтобы справляться с именами файлов, содержащими пробелы)

Это может быть (не проверено) более эффективно, чем использование -exec, потому что оно будет передавать список файлов в xargs, а xargs гарантирует, что команда jhead не будет слишком длинной.

Ответ 3

С -exec вы можете запускать только один исполняемый файл с некоторыми аргументами, а не с произвольными командами оболочки. Чтобы обойти это, вы можете использовать sh -c '<shell command>'.

Обратите внимание, что использование -exec довольно неэффективно. Для каждого найденного файла команда должна быть выполнена снова. Было бы более эффективно, если бы вы могли избежать этого. (Например, перемещая grep вне -exec или проводя результаты с find до xargs, как предложено Palmin.)

Ответ 4

Использование команды find для этого типа задачи, возможно, не самая лучшая альтернатива. Я часто использую следующую команду для поиска файлов, содержащих запрошенную информацию:

for i in dist/*.jar; do echo ">> $i"; jar -tf "$i" | grep BeanException; done

Ответ 5

Поскольку это выводит список, вы не должны:

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.