Как использовать канал в параметре exec для команды find?
Я пытаюсь построить команду find для обработки группы файлов в каталоге, используя два разных исполняемых файла. К сожалению, -exec on find не позволяет использовать pipe или даже | потому что оболочка сначала интерпретирует этот символ.
вот именно то, что я пытаюсь сделать (что не работает, потому что труба заканчивается командой find):
find /path/to/jpgs -type f -exec jhead -v {} | grep 123 ; -print
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