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



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



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



find /path/to/jpgs -type f -exec jhead -v {} | grep 123 ; -print
581   6  

6 ответов:

попробуй такое

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

в качестве альтернативы вы можете попробовать встроить свой оператор exec в сценарий sh, а затем сделать:

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 на результаты find-exec.

есть еще один способ, которым вы можете это сделать, но это также довольно гетто.

используя опцию оболочки extquote, вы можете сделать что-то подобное этому, чтобы найти материал exec, а затем передать его в sh.

root@ifrit findtest # find -type f -exec echo ls $"|" cat \;|sh
filename


root@ifrit findtest # find -type f -exec echo ls $"|" cat $"|" xargs cat\;|sh
h

Я просто подумал, что добавлю это, потому что, по крайней мере, так, как я это визуализировал, это было ближе к исходному вопросу OP об использовании труб в exec.

Comments

    Ничего не найдено.