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
-R
funktioniert 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 find
und xargs
für Details.
-print0
nach 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 find
und xargs
:
find . -name '*.cc' -print0 -o -name '*.h' -print0 | xargs -0 grep hello /dev/null
Durch die Verwendung von wird /dev/null
sichergestellt, dass Dateinamen gedruckt werden. Das -print0
und -0
befasst 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 find
und 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 nullglob
Fehlermeldungen 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