Jak grep rekursywnie ciąg znaków przez wszystkie .gzpliki we wszystkich katalogach i podkatalogach?
Jak grep rekursywnie ciąg znaków przez wszystkie .gzpliki 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
xargsdostarczy 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 findpolecenie. Użycie opcji -print0i -0pozwala 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 {} +
-Haby 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 -rdo przejścia przez drzewo lub jeśli -r nie działa, xargs zgrep
/bin/zgrep: -r: option not supportedna 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/nullspowoduje, ż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) -execargument znajdujący doda jak najwięcej nazw plików (podobnie jak xargszachowuje 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).
-Haby zawsze wyświetlać nazwę pliku z pasującą linią, przynajmniej w GNU grep, zamiast /dev/nullhacka.