Z find
:
cd /the/dir
find . -type f -exec grep pattern {} +
( -type f
jest wyszukiwanie tylko w zwykłych plikach (z wyłączeniem również dowiązań symbolicznych, nawet jeśli wskazują one na zwykłe pliki). Jeśli chcesz wyszukiwać w dowolnym typie plików oprócz katalogów (ale uważaj, istnieją pewne typy plików, takie jak fifos lub / dev / zero, które na ogół nie chcesz czytać), zamień -type f
na GNU ! -xtype d
( -xtype d
pasuje do plików typu katalog po rozpoznaniu dowiązania symbolicznego)).
Z GNU grep
:
grep -r pattern /the/dir
(ale uważaj, jeśli nie masz najnowszej wersji GNU grep, która będzie podążać za dowiązaniami symbolicznymi podczas schodzenia do katalogów). Nieregularne pliki nie będą wyszukiwane, chyba że dodasz -D read
opcję. Najnowsze wersje GNU grep
nadal nie będą jednak wyszukiwać wewnątrz dowiązań symbolicznych.
Bardzo stare wersje GNU find
nie obsługiwały standardowej {} +
składni, ale tam możesz użyć niestandardowej:
cd /the/dir &&
find . -type f -print0 | xargs -r0 grep pattern
Występy prawdopodobnie będą związane z operacjami wejścia / wyjścia. To czas na wyszukiwanie byłby czasem potrzebnym do odczytania wszystkich danych z pamięci.
Jeśli dane znajdują się na nadmiarowej macierzy dyskowej, odczytywanie kilku plików jednocześnie może poprawić wydajność (i w przeciwnym razie może je pogorszyć). Jeśli wydajność nie jest związana z operacjami we / wy (ponieważ na przykład wszystkie dane znajdują się w pamięci podręcznej) i masz wiele procesorów, greps
może również pomóc współbieżność . Można to zrobić z GNU xargs
„s -P
opcja.
Na przykład, jeśli dane znajdują się w macierzy RAID1 z 3 dyskami lub jeśli dane znajdują się w pamięci podręcznej i masz 3 procesory, których czas oszczędzić:
cd /the/dir &&
find . -type f -print0 | xargs -n1000 -r0P3 grep pattern
(tutaj za pomocą -n1000
odradzania nowego grep
co 1000 plików, do 3 równolegle działających jednocześnie).
Należy jednak pamiętać, że jeśli dane wyjściowe grep
zostaną przekierowane, otrzymamy źle przeplecione dane wyjściowe z 3 grep
procesów, w którym to przypadku możesz chcieć uruchomić je jako:
find . -type f -print0 | stdbuf -oL xargs -n1000 -r0P3 grep pattern
(w najnowszym systemie GNU lub FreeBSD) lub użyj --line-buffered
opcji GNU grep
.
Jeśli pattern
jest to ciąg stały, dodanie -F
opcji może poprawić sprawy.
Jeśli nie są to dane wielobajtowe lub jeśli chodzi o dopasowanie tego wzorca, nie ma znaczenia, czy dane są znakiem wielobajtowym, czy nie:
cd /the/dir &&
LC_ALL=C grep -r pattern .
może znacznie poprawić wydajność.
Jeśli często przeprowadzasz takie wyszukiwania, możesz zindeksować swoje dane przy użyciu jednej z wielu wyszukiwarek.
find
zxargs
lubgrep -R