Jak za pomocą grep przeszukać bieżący katalog w poszukiwaniu wszystkich plików zawierających ciąg „hello”, które wyświetlają tylko pliki .h i .cc?

138

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?

przepełnienie stosu
źródło

Odpowiedzi:

161
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

Z innego pytania o przepełnienie stosu

przepełnienie stosu
źródło
5
W oryginalnym poście powiedziałeś „katalog bieżący” i nic o tym, że potrzebujesz go rekursywnie lub w podkatalogach (zdaję sobie sprawę, że wspomniałeś o tym w późniejszym poście). Dla zainteresowanych tym, jak to zrobić tylko w bieżącym katalogu, jest to 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
jbobbins
1
grep -r --include=*.{java,py} "hello" .
Z jakiegoś powodu nie działa to w systemie MacOS, nawet przy użyciu narzędzia GNU grep.
xApple
49

Możesz przekazać symbole wieloznaczne zamiast określać nazwy plików lub używać stdin.

grep hello *.h *.cc
Donald Miner
źródło
Potrzebuję również wszystkich podkatalogów
stackoverflow
Dodawanie -Rniestety nie działa. Rozszerza *przed przejściem rekurencyjnie.
Donald Miner
Odpowiedź Noufala jest tym, czego szukasz, jeśli potrzebujesz podkatalogów
Donald Miner
8
@Jammin Zadając pytanie, powinieneś o tym jasno powiedzieć. Ta odpowiedź jest „poprawną” odpowiedzią na zadane pytanie.
jordanm
$ grep -R hello *# znajdź ze wszystkich słów zawierających cześć (w tym podkatalog)
19

find . -name \*.cc -print0 -or -name \*.h -print0 | xargs -0 grep "hello".

Sprawdź w instrukcji dla stron findoraz xargsdla szczegółów.

Noufal Ibrahim
źródło
1
Musisz mieć -print0po '*.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.
Jonathan Leffler
Dzięki, że to zauważyłeś. Zmieniłem odpowiedź, aby to „naprawić”.
Noufal Ibrahim
3
Możesz także użyć find -exec +składni zamiast xargs
jordanm
@jordanm: Tak: -exec grep "hello" {} +gdzie para nawiasów reprezentuje nazwy plików. Dobry pomysł.
Jonathan Leffler
10

Aby rekurencyjnie przeszukać bieżący katalog:

grep -r 'myString' .
AB Abhi
źródło
5

Jeśli potrzebujesz wyszukiwania rekurencyjnego, masz wiele opcji. Powinieneś to rozważyć ack.

W przeciwnym razie, jeśli masz GNU findi xargs:

find . -name '*.cc' -print0 -o -name '*.h' -print0 | xargs -0 grep hello /dev/null

Użycie programu /dev/nullzapewnia wydrukowanie nazw plików; -print0i -0oferty 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 findi xargs.

Jonathan Leffler
źródło
uwaga, możesz też powiedziećfind ... -exec grep "hello" {} +
fedorqui 'SO przestań krzywdzić'
5

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)$'`
Jacek
źródło
2
grep -l hello **/*.{h,cc}

Możesz chcieć shopt -s nullglobuniknąć komunikatów o błędach, jeśli nie ma plików .h lub .cc.

glenn jackman
źródło
4
Wiem, jak korzystać z Google itp. Pytałem o to tutaj, ponieważ kilka odpowiedzi ma „-l” i dobrze jest mieć wszystkie informacje w jednym miejscu.
Andrew Swift,
-l (małe litery „el”) Wyłącza normalne wyjście. Wyświetla nazwę każdego pliku wejściowego, z którego wynik zostałby normalnie wydrukowany. Skanowanie / wyszukiwanie zatrzyma się przy pierwszym dopasowaniu.
Rex CoolCode Charles
-1

Najprostszy sposób: grep -Ril "Twój tekst" /

user1733951
źródło
1
To nie wyświetla tylko plików .h lub .cc i przydatne jest wyjaśnienie, jakich opcji użyłeś i dlaczego.
kon psych