Мне интересно, есть ли способ включить или исключить файлы из результатов find(1) на основе кода выхода или выхода другой программы. В частности, я хотел бы иметь возможность запустить find(1) так, чтобы он возвращал только те файлы, которые содержат положительное совпадение для регулярного выражения.

Я понимаю, что это может быть достигнуто путем передачи вывода find(1) через egrep, но я бы хотел сделать все это из find(1).

Например, есть ли способ преобразовать следующее в один вызов find(1) без каких-либо каналов?

find . [test] | xargs egrep -l [regex]

1 ответ1

2

-exec оценивается как "true", если команда возвращает ноль (успех):

find . -type f -exec egrep -qs "regex" {} \; -print

Замените -print на действие по вашему выбору.


Однако учтите , что таким образом egrep выполняется один раз для каждого файла. Для сравнения:

equal ~/code $ time find -type f -exec grep -qs bin/env {} \; -print | wc -l
60

real    0m0.760s
user    0m0.104s
sys     0m0.596s

против

equal ~/code $ time find -type f -print0 | xargs -0 egrep -l bin/env | wc -l
60

real    0m0.021s
user    0m0.003s
sys     0m0.023s

(Протестировано в довольно небольшом репозитории Git, 300 файлов, ~ 2,6 МБ.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .