Wyklucz / włącz pliki z komendy unix find na podstawie programu

0

Zastanawiam się, czy jest jakiś sposób na włączenie lub wykluczenie plików z wyników find (1) w oparciu o kod wyjściowy lub kod zakończenia innego programu. W szczególności chciałbym móc uruchomić find (1) w taki sposób, że zwraca tylko te pliki, które zawierają dopasowanie pozytywne dla wyrażenia regularnego.

Zdaję sobie sprawę, że można tego dokonać poprzez potokowanie wyjścia find (1) przez egrep, ale chciałbym móc to wszystko zrobić z wewnątrz find (1).

Na przykład, czy jest jakiś sposób przekonwertować następujące polecenie w pojedyncze wywołanie find (1) bez żadnych potoków?

find . [test] | xargs egrep -l [regex]
Bryan Kyle
źródło

Odpowiedzi:

2

-exec zwraca wartość „prawda”, jeśli polecenie zwraca zero (sukces):

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

Zamień -printna wybrane działanie.


Należy jednak pamiętać, że ten sposób egrepjest wykonywany raz dla każdego pliku . Porównać:

równe ~ / kod $ czas znajdź -typ f -exec grep -qs bin / env {} \; -print | wc -l
60

prawdziwe 0m0,760s
użytkownik 0m0.104s
sys 0m0,596s

vs.

równy ~ / kod $ czas znajdź -typ f -print0 | xargs -0 egrep -l bin / env | wc -l
60

prawdziwe 0m0.021s
użytkownik 0m0,003s
sys 0m0.023s

(Testowane na raczej małym repozytorium Git, 300 plików, ~ 2,6 MB.)

grawitacja
źródło