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?
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?
Odpowiedzi:
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
Możesz przekazać symbole wieloznaczne zamiast określać nazwy plików lub używać stdin.
grep hello *.h *.cc
-R
niestety nie działa. Rozszerza *
przed przejściem rekurencyjnie.
find . -name \*.cc -print0 -or -name \*.h -print0 | xargs -0 grep "hello"
.
Sprawdź w instrukcji dla stron find
oraz xargs
dla szczegółów.
-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ł.
Jeśli potrzebujesz wyszukiwania rekurencyjnego, masz wiele opcji. Powinieneś to rozważyć ack
.
W przeciwnym razie, jeśli masz GNU find
i xargs
:
find . -name '*.cc' -print0 -o -name '*.h' -print0 | xargs -0 grep hello /dev/null
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ć:
find . -name '*.*[ch]' -print | xargs grep hello /dev/null
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
i xargs
.
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:
grep -lR hello * | egrep '(cc|h)$'
... i to wyświetla nazwy i zawartość plików:
grep hello `grep -lR hello * | egrep '(cc|h)$'`
grep -l hello **/*.{h,cc}
Możesz chcieć shopt -s nullglob
uniknąć komunikatów o błędach, jeśli nie ma plików .h lub .cc.
Najprostszy sposób: grep -Ril "Twój tekst" /
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/777456