Исключить/Включить файлы из команды поиска Unix на основе программы

Исключить/Включить файлы из команды поиска Unix на основе программы

Мне интересно, есть ли способ включить или исключить файлы из результатов 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 МБ.)

Связанный контент