Jak grep rekursywnie ciąg znaków przez wszystkie .gz
pliki we wszystkich katalogach i podkatalogach?
8
@ 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.Coś w stylu
źródło
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:
Dodanie
/dev/null
spowoduje, że zgrep zobaczy dwa nazwy plików, więc wyświetli nazwę pliku, jeśli znajdzie ciągEDYTOWAĆ
Dalsze badania ujawniają, że dla mojej maszyny (OS / X)
-exec
argument znajdujący doda jak najwięcej nazw plików (podobnie jakxargs
zachowuje się).źródło
-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.Poniżej działa uczta w
zsh
Może również pracować
bash
,ksh
itd ...źródło