2010-09-24 19 views

Odpowiedz

27
find/-type f -name filename.ext -exec grep -l 'lookingfor' {} + 

Używanie + aby zakończyć polecenie jest bardziej wydajny niż \; ponieważ find wysyła całą partię plików grep zamiast wysyłać je jeden po drugim. Pozwala to uniknąć fork/exec dla każdego znalezionego pliku.

Jakiś czas temu zrobiłem kilka testów, aby porównać skuteczność xargs vs {} + vs {} \; i stwierdziliśmy, że {} + był szybszy. Oto niektóre z moich wyników:

time find . -name "*20090430*" -exec touch {} + 
real 0m31.98s 
user 0m0.06s 
sys  0m0.49s 

time find . -name "*20090430*" | xargs touch 
real 1m8.81s 
user 0m0.13s 
sys  0m1.07s 

time find . -name "*20090430*" -exec touch {} \; 
real 1m42.53s 
user 0m0.17s 
sys  0m2.42s 
+0

Dodałbym tylko '--color' do' grep', uważam, że o wiele łatwiej jest zobaczyć rzeczy. Właściwie to po prostu zdałem sobie sprawę, że nie bierze on aliasu zdefiniowanego w '.bashrc'. – Alexandre

1

Spróbuj:

find/-type f -name filename.ext -exec grep -H -n 'lookingfor' {} \; 

find wyszukiwania rekurencyjnie począwszy od korzenia / plików nazwanych filename.ext i dla każdego znalezionego wystąpienia biegnie grep na nazwę pliku szukasz lookingfor i jeśli znajdzie drukuje numer linii (-n) i nazwa pliku (-H).

+0

Biorąc pod uwagę ogromną liczbę plików , znacznie wydajniejsze jest użycie 'xargs', które uruchamia' grep' tylko raz, jak w odpowiedzi digena. –

3

Bardziej prosty byłoby

find/-type f -name filename.ext -print0 | xargs -0 grep 'lookingfor' 

-print0 znaleźć & 0 do xargs by złagodzić problem dużej liczby plików w jednym katalogu.

+1

'-print0' i' -0' nie ma nic wspólnego z dużą liczbą plików. Zapewnia to 'find | xargs' działa, gdy jakiś plik ma spacje w swoich nazwach. –

+0

Didier masz absolutną rację, tutaj jest fragment strony podręcznika dla wszystkich innych, -print0 Prawda; wypisz pełną nazwę pliku na standardowym wyjściu, a następnie przez pusty znak (zamiast nowego znaku, który używa -print). Dzięki temu nazwy plików zawierające znaki nowej linii lub inne typy białych znaków mogą być poprawnie interpretowane przez protony przetwarzające wynik wyszukiwania. Ta opcja odpowiada opcji -0 xargs. – digen

6

Przejdź do odpowiedniego katalogu i wpisz następujące polecenie.

znajdowanie. -name "* .ext" | xargs grep „lookingfor”

0

znaleźć następującą komendę najprostszy sposób:

grep -R --include="filename.ext" lookingfor 

lub dodać -i wyszukiwania wielkość liter ma znaczenie:

grep -i -R --include="filename.ext" lookingfor 
Powiązane problemy