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?

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


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

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.


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' .

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.


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)$'`

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.


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" /


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.