Как я могу сказать find распечатать список файлов на основе результатов выполнения конвейера для каждого файла? - PullRequest
3 голосов
/ 07 октября 2011

Я знаю, что мы можем использовать find -exec ..., чтобы указать команду для запуска для каждого файла, и вывести только те файлы, для которых команда выполнена успешно, например, find . -exec test -d {} \; -print распечатает все каталоги.Я хотел бы дать -exec конвейер и иметь find возвращаемых файлов, для которых последняя команда конвейера вернула true.

Если быть точным, я хотел бы запустить jar -t для каждого файлаи grep вывод имени класса.Я попытался find . -name \*jar -exec jar -tf {} \|grep -q foo \; -print, но он возвращает все файлы.Как я могу это изменить?

1 Ответ

2 голосов
/ 08 октября 2011

Использование командного канала в качестве аргумента для -exec будет работать только в том случае, если find будет использовать подоболочку. Но find просто выполняет команду one с вызовом функции exec () и все последующие токены до ; будут переданы в качестве аргументов команды.

Поэтому, когда вам нужны изящные функции оболочки, вам придется вызывать подоболочку самостоятельно:

 $ find . -name '*.jar' -exec sh -c 'jar -tf {} | grep -q foo' \; -print
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...