2008-09-15 13 views
56

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

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

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

ответ

57

Попробуйте

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

В качестве альтернативы можно попытаться встроить EXEC заявление внутри ш сценария, а затем сделать:

find -exec some_script {} \; 
+1

@Martin: вы поместили закрывающий апостроф в конце «-print», когда он должен быть в конце «123», а затем последний «\;» не требуется. – tzot 2008-10-11 23:11:53

1

Как это выводит список будет вам: не

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.

+0

Это не работает, потому что мне нужен -print для работы. Если grep возвращает успех, тогда поиск печатает имя файла, иначе это не так. – hoyhoy 2008-09-15 09:54:52

+0

Это сработало для меня, спасибо за предложение – Arturski 2016-10-05 12:24:10

3

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

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

+0

Все нормально. Тем не менее, я думаю, что мой комментарий о (in) эффективности -exec также стоит отметить. – mweerden 2008-09-16 11:18:00

11

Несколько иной подход было бы использовать xargs:

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

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

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

3

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

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

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

С помощью опции экскаватора оболочки вы можете сделать что-то похожее на это, чтобы сделать find exec stuff, а затем передать его sh.

[email protected] findtest # find -type f -exec echo ls $"|" cat \;|sh 
filename 


[email protected] findtest # find -type f -exec echo ls $"|" cat $"|" xargs cat\;|sh 
h 

Я просто полагал, что я хотел бы добавить, что, так как, по крайней мере так, как я визуализируется, он был ближе к первоначальному вопросу Ор в использовании труб в Exec.