Jak za pomocą grep przeszukać bieżący katalog w poszukiwaniu wszystkich plików zawierających ciąg „hello” i wyświetlić tylko pliki .h i .cc?
138
grep -r --include=*.{cc,h} "hello" .
To brzmi: szukaj rekurencyjnie (również we wszystkich podkatalogach) dla wszystkich plików .cc LUB .h, które zawierają „hello” w tym .
(bieżącym) katalogu
grep -si "hello" --include=*.{cc,h} ./* ./.*
(przeszukuje również ukryte pliki). Oto generic version aby wyszukać ciąg we wszystkich ukrytych plików /:grep -s "hello" * .*
. Być może najbardziej ogólnie przydatny (i najprostszym), ten przeszukuje wszystkie pliki inne niż ukryte dla „hello”:grep -si "hello" ./*
Dzięki tym poście: askubuntu.com/a/777456grep -r --include=*.{java,py} "hello" .
Możesz przekazać symbole wieloznaczne zamiast określać nazwy plików lub używać stdin.
źródło
-R
niestety nie działa. Rozszerza*
przed przejściem rekurencyjnie.$ grep -R hello *
# znajdź ze wszystkich słów zawierających cześć (w tym podkatalog)find . -name \*.cc -print0 -or -name \*.h -print0 | xargs -0 grep "hello"
.Sprawdź w instrukcji dla stron
find
orazxargs
dla szczegółów.źródło
-print0
po'*.cc'
znaku, ponieważ w przeciwnym razie nie masz akcji dla tej części wyszukiwania. Albo trzeba wstawić nawiasy tam:find . \( -name '*.cc' -or -name '*.h' \) -print0
.find -exec +
składni zamiast xargs-exec grep "hello" {} +
gdzie para nawiasów reprezentuje nazwy plików. Dobry pomysł.Aby rekurencyjnie przeszukać bieżący katalog:
źródło
Jeśli potrzebujesz wyszukiwania rekurencyjnego, masz wiele opcji. Powinieneś to rozważyć
ack
.W przeciwnym razie, jeśli masz GNU
find
ixargs
:Użycie programu
/dev/null
zapewnia wydrukowanie nazw plików;-print0
i-0
oferty z nazw plików zawierających przestrzenie (nowe linie, etc).Jeśli nie masz zadziornych nazw (ze spacjami itp.), Możesz użyć:
Może to przynieść kilka nazw, których nie zamierzałeś, ponieważ dopasowanie wzorca jest bardziej niewyraźne (ale prostsze), ale poza tym działa. Działa z wersjami
find
ixargs
.źródło
find ... -exec grep "hello" {} +
Jeśli uważnie przeczytam twoje pytanie, możesz poprosić „grep, aby przeszukał bieżący katalog w poszukiwaniu wszystkich plików zawierających ciąg znaków„ hello ”i wyświetlić tylko pliki .h i .cc”. Aby spełnić Twoje dokładne wymagania, oto moje zgłoszenie:
Spowoduje to wyświetlenie nazw plików:
... i to wyświetla nazwy i zawartość plików:
źródło
Możesz chcieć
shopt -s nullglob
uniknąć komunikatów o błędach, jeśli nie ma plików .h lub .cc.źródło
Najprostszy sposób: grep -Ril "Twój tekst" /
źródło