1353 Stimmen

Wie kann ich rekursiv grep, aber nur in Dateien mit bestimmten Erweiterungen?

Ich arbeite an einem Skript, um bestimmte Verzeichnisse mit grep zu durchsuchen:

{ 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@domain.example

Wie kann ich die Ergebnisse nur auf die Erweiterungen .h und .cpp beschränken?

18voto

hao Punkte 559

Diese Antwort ist gut:

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

Aber sie kann aktualisiert werden zu:

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

Was einfacher sein kann.

14voto

fedorqui Punkte 249453

Da es sich hier um das Auffinden von Dateien handelt, verwenden wir find!

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

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

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

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

Wenn Sie diese Distribution von find nicht haben, müssen Sie einen Ansatz wie den von Amir Afghani verwenden, der -o zum Verketten von Optionen nutzt (der Name endet entweder mit .h oder mit .cpp):

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

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

grep "Ihr Muster" -r --include=*.{cpp,h}
#                      ^^^^^^^^^^^^^^^^^^^

10voto

user3640130 Punkte 433

Der einfachste Weg ist:

find . -type f -name '*.extension' 2>/dev/null | xargs grep -i string

Fügen Sie 2>/dev/null hinzu, um die Fehlerausgabe zu unterdrücken.

Um mehr Dateierweiterungen einzuschließen und nach Passwörtern im gesamten System zu suchen:

find / -type f \( -name '*.conf' -o -name "*.log" -o -name "*.bak" \) 2>/dev/null |
xargs grep -i password

4voto

Eldamir Punkte 9030

ag (der silberne Sucher) hat ziemlich einfache Syntax dafür

       -G --file-search-regex MUSTER
          Suche nur Dateien, deren Namen zu MUSTER passen.

daher

ag -G *.h -G *.cpp CP_Image

2voto

where23 Punkte 473

Sie sollten für jedes "-o -name " "-exec grep " schreiben:

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

Oder gruppieren Sie sie mit ( )

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

Die Option '-Hn' zeigt den Dateinamen und die Zeilennummer an.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X