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
-Rniestety 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 findoraz xargsdla szczegółów.
-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.
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 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.
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 nullglobuniknąć 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