Wie verwende ich grep, um das aktuelle Verzeichnis nach allen Dateien zu durchsuchen, die die Zeichenfolge "Hallo" enthalten, und nur .h- und .cc-Dateien anzuzeigen?
Wie verwende ich grep, um das aktuelle Verzeichnis nach allen Dateien zu durchsuchen, die die Zeichenfolge "Hallo" enthalten, und nur .h- und .cc-Dateien anzuzeigen?
Antworten:
grep -r --include=*.{cc,h} "hello" .
Dies lautet: Suchen Sie rekursiv (auch in allen Unterverzeichnissen) nach allen .cc ODER .h-Dateien, die in diesem .(aktuellen) Verzeichnis "Hallo" enthalten
Sie können Platzhalter übergeben, anstatt Dateinamen anzugeben oder stdin zu verwenden.
grep hello *.h *.cc
-Rfunktioniert leider nicht. Es erweitert das *vor dem rekursiven Gehen.
find . -name \*.cc -print0 -or -name \*.h -print0 | xargs -0 grep "hello".
Überprüfen Sie die Handbuchseiten auf findund xargsfür Details.
-print0nach dem haben, '*.cc'da Sie sonst keine Aktion für diesen Teil der Suche haben. Oder Sie müssen dort Klammern einfügen : find . \( -name '*.cc' -or -name '*.h' \) -print0.
find -exec +Syntax anstelle von xargs verwenden
-exec grep "hello" {} +wobei das Klammerpaar die Dateinamen darstellt. Guter Vorschlag.
Wenn Sie eine rekursive Suche benötigen, haben Sie verschiedene Möglichkeiten. Sie sollten überlegen ack.
Andernfalls, wenn Sie GNU haben findund xargs:
find . -name '*.cc' -print0 -o -name '*.h' -print0 | xargs -0 grep hello /dev/null
Durch die Verwendung von wird /dev/nullsichergestellt, dass Dateinamen gedruckt werden. Das -print0und -0befasst sich mit Dateinamen, die Leerzeichen enthalten (Zeilenumbrüche usw.).
Wenn Sie keine störenden Namen haben (mit Leerzeichen usw.), können Sie Folgendes verwenden:
find . -name '*.*[ch]' -print | xargs grep hello /dev/null
Dies könnte einige Namen aufgreifen, die Sie nicht beabsichtigt haben, da die Musterübereinstimmung unschärfer (aber einfacher) ist, aber ansonsten funktioniert. Und es funktioniert mit Nicht-GNU-Versionen von findund xargs.
find ... -exec grep "hello" {} +
Wenn ich Ihre Frage sorgfältig gelesen habe, fragen Sie nach "grep, um das aktuelle Verzeichnis nach allen Dateien zu durchsuchen, die die Zeichenfolge" Hallo "enthalten und nur .h- und .cc-Dateien anzeigen". Um Ihre genauen Anforderungen hier zu erfüllen, ist mein Beitrag:
Dies zeigt die Dateinamen an:
grep -lR hello * | egrep '(cc|h)$'
... und dies zeigt die Dateinamen und Inhalte an:
grep hello `grep -lR hello * | egrep '(cc|h)$'`
grep -l hello **/*.{h,cc}
Möglicherweise möchten Sie shopt -s nullglobFehlermeldungen vermeiden, wenn keine .h- oder keine .cc-Dateien vorhanden sind.
Der einfachste Weg: grep -Ril "Dein Text" /
grep -si "hello" --include=*.{cc,h} ./* ./.*(durchsucht auch versteckte Dateien). Hier ist eine generische Version, um in allen / versteckten Dateien nach einer Zeichenfolge zu suchen :grep -s "hello" * .*. Vielleicht am allgemeinsten nützlich (und am einfachsten), durchsucht dies alle nicht versteckten Dateien nach "Hallo":grep -si "hello" ./*Dank dieses Beitrags: askubuntu.com/a/777456