Мне интересно, есть ли способ включить или исключить файлы из результатов find(1) на основе вывода или кода выхода другой программы. В частности, я хотел бы иметь возможность запустить find(1) так, чтобы он возвращал только те файлы, которые содержат положительное совпадение с регулярным выражением.
Я понимаю, что это можно сделать, передав вывод find(1) через egrep, но мне бы хотелось иметь возможность делать все это изнутри find(1).
Например, есть ли способ преобразовать следующее в один вызов find(1) без каких-либо каналов?
find . [test] | xargs egrep -l [regex]
решение1
-exec
оценивается как «истина», если команда возвращает ноль (успех):
find . -type f -exec egrep -qs "regex" {} \; -print
Замените -print
действием по вашему выбору.
Однако учтите, что этот способ egrep
выполняется один разкаждый файл. Сравнивать:
равно ~/код $ время find -type f -exec grep -qs bin/env {} \; -print | wc -l 60 реальный 0м0.760с пользователь 0m0.104s сис 0м0.596с
против.
равно ~/код $ время find -type f -print0 | xargs -0 egrep -l bin/env | wc -l 60 реальный 0м0.021с пользователь 0m0.003s сис 0м0.023с
(Протестировано на довольно небольшом репозитории Git, 300 файлов, ~2,6 МБ.)