it-swarm-eu.dev

grep, aber nur bestimmte Dateierweiterungen

Ich arbeite daran, einige Skripte in grep bestimmte Verzeichnisse zu schreiben, aber diese Verzeichnisse enthalten alle Arten von Dateitypen.

Ich möchte grep nur .h und .cpp für den Moment, aber vielleicht ein paar andere in der Zukunft.

Bisher habe ich:

{ grep -r -i CP_Image ~/path1/;

grep -r -i CP_Image ~/path2/;

grep -r -i CP_Image ~/path3/;

grep -r -i CP_Image ~/path4/;

grep -r -i CP_Image ~/path5/;} 

| mailx -s GREP [email protected]

Kann mir jemand zeigen, wie ich jetzt nur die spezifischen Dateierweiterungen hinzufügen würde?

835
Jason

Verwenden Sie einfach den Parameter --include wie folgt:

grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345] | mailx -s GREP [email protected]

das sollte machen was du willst.

Syntax-Hinweise:

  • -r - rekursiv suchen
  • -i - case -nempfindlich search
  • --include=\*.${file_extension} - Sucht nach Dateien, die nur mit der (den) Erweiterung (en) oder dem Dateimuster übereinstimmen
1171
Nelson

Einige dieser Antworten schienen zu syntaxlastig zu sein, oder sie verursachten Probleme auf meinem Debian-Server. Das hat bei mir perfekt funktioniert:

PHP Revolution: Wie greife ich unter Linux auf Dateien zu, aber nur auf bestimmte Dateierweiterungen?

Nämlich:

grep -r --include=\*.txt 'searchterm' ./

... oder Version ohne Berücksichtigung der Groß-/Kleinschreibung ...

grep -r -i --include=\*.txt 'searchterm' ./
  • grep: Befehl

  • -r: rekursiv

  • -i: Groß-/Kleinschreibung ignorieren

  • --include: alle * .txt: Textdateien (mit\schließen, falls Sie ein Verzeichnis mit Sternchen in den Dateinamen haben)

  • 'searchterm': Was soll gesucht werden?

  • ./: Startet im aktuellen Verzeichnis.

251
HoldOffHunger

Wie wäre es mit:

find . -name '*.h' -o -name '*.cpp' -exec grep "CP_Image" {} \; -print
48
Amir Afghani
grep -rnw "some thing to grep" --include=*.{module,inc,php,js,css,html,htm} ./
46
Yuri Malov

Auf HP- und Sun-Servern gibt es keine Option -r. Auf meinem HP-Server hat diese Methode funktioniert

find . -name "*.c" | xargs grep -i "my great text"

-i ist für die Suche nach Zeichenketten ohne Berücksichtigung der Groß- und Kleinschreibung

15
Sam B

Da es darum geht, Dateien zu finden , verwenden wir find!

Mit GNU find können Sie die Option -regex verwenden, um die Dateien im Verzeichnisbaum zu suchen, deren Erweiterung entweder .h oder .cpp ist:

find -type f -regex ".*\.\(h\|cpp\)"
#            ^^^^^^^^^^^^^^^^^^^^^^^

Dann ist es nur eine Frage der Ausführung von grep für jedes seiner Ergebnisse:

find -type f -regex ".*\.\(h\|cpp\)" -exec grep "your pattern" {} +

Wenn Sie diese Fundverteilung nicht haben, müssen Sie einen Ansatz wie Amir Afghani's verwenden und -o verwenden, um Optionen zu verketten (. Der Name ist entweder endend mit .h oder mit .cpp):

find -type f \( -name '*.h' -o -name '*.cpp' \) -exec grep "your pattern" {} +
#            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Und wenn Sie wirklich grep verwenden möchten, befolgen Sie die in --include angegebene Syntax:

grep "your pattern" -r --include=*.{cpp,h}
#                      ^^^^^^^^^^^^^^^^^^^
12
fedorqui

Der einfachste Weg ist

find . -type  f -name '*.extension' | xargs grep -i string 
7
user3640130

Die folgende Antwort ist gut.

grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345] | mailx -s GREP [email protected]

Kann aber aktualisiert werden auf:

grep -r -i --include \*.{h,cpp} CP_Image ~/path[12345] | mailx -s GREP [email protected]

Welches kann einfacher sein.

3
hao

ag (der Silbersucher) hat dafür eine recht einfache Syntax

       -G --file-search-regex PATTERN
          Only search files whose names match PATTERN.

damit

ag -G *.h -G *.cpp CP_Image <path>
2
Eldamir

Mir ist bewusst, dass diese Frage etwas veraltet ist, aber ich möchte die Methode, die ich normalerweise benutze, um sie zu finden, weitergeben .c und .h Dateien:

tree -if | grep \\.[ch]\\b | xargs -n 1 grep -H "#include"

oder wenn du auch die Zeilennummer brauchst:

tree -if | grep \\.[ch]\\b | xargs -n 1 grep -nH "#include"
2
Tom

Sollte "-exec grep" für jeden "-o-Namen" schreiben

find . -name '*.h' -exec grep -Hn "CP_Image" {} \; -o -name '*.cpp' -exec grep -Hn "CP_Image" {} \;

Oder gruppiere sie nach ()

find . \( -name '*.h' -o -name '*.cpp' \) -exec grep -Hn "CP_Image" {} \;

option '-Hn' zeigt den Dateinamen und die Zeile an.

1
where23