Jak grep rekursywnie ciąg znaków przez wszystkie .gz
pliki we wszystkich katalogach i podkatalogach?
Jak grep rekursywnie ciąg znaków przez wszystkie .gz
pliki we wszystkich katalogach i podkatalogach?
Odpowiedzi:
@ Steve Weet jest już prawie na miejscu. Użycie / dev / null jako dodatkowego argumentu jest dobrym sposobem na wymuszenie wyświetlenia nazwy pliku (pamiętam to, dzięki Steve), ale nadal uruchamia on exec dla każdego znalezionego pliku - ogromne obciążenie.
Chcesz uruchamiać zgrep tak rzadko, jak to możliwe, aby jak najlepiej wykorzystać każde wykonanie:
find . -iname '*.gz' -print0 | xargs -0 zgrep PATTERN
xargs
dostarczy tyle argumentów (nazw plików), ile to możliwe, aby zgrep i wielokrotnie go wykonywał, dopóki nie użyje wszystkich plików dostarczonych przez find
polecenie. Użycie opcji -print0
i -0
pozwala mu działać, jeśli w nazwach plików lub katalogów są spacje.
W Mac OS X możesz osiągnąć ten sam efekt bez xargs:
find . -iname '*.gz' -exec zgrep PATTERN {} +
-H
aby zawsze wyświetlać nazwę pliku z pasującą linią, przynajmniej w GNU grep.
$ zgrep --help
Usage: /bin/zgrep [OPTION]... [-e] PATTERN [FILE]...
Look for instances of PATTERN in the input FILEs, using their
uncompressed contents if they are compressed.
Coś w stylu
find . -iname "*.gz" -exec zgrep PATTERN {} \
zgrep -r
do przejścia przez drzewo lub jeśli -r nie działa, xargs zgrep
/bin/zgrep: -r: option not supported
na mój nowo zainstalowany system Ubuntu.
xargs
.
@ aioobe jest już prawie na miejscu. Polecenie wykona zadanie, ale nie poda nazwy pliku
Poniższe informacje powinny również zawierać nazwę pliku:
find . -iname "*.gz" -exec zgrep PATTERN {} /dev/null \;
Dodanie /dev/null
spowoduje, że zgrep zobaczy dwa nazwy plików, więc wyświetli nazwę pliku, jeśli znajdzie ciąg
EDYTOWAĆ
Dalsze badania ujawniają, że dla mojej maszyny (OS / X) -exec
argument znajdujący doda jak najwięcej nazw plików (podobnie jak xargs
zachowuje się).
-exec
- chodzi mi o przenośność, więc nie używałbym jej w skrypcie, ale świetnie nadaje się do wiersza poleceń.
find
, ale większości współczesnych (np. W dystrybucjach opartych na Debianie).
-H
aby zawsze wyświetlać nazwę pliku z pasującą linią, przynajmniej w GNU grep, zamiast /dev/null
hacka.