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?
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 übereinstimmenEinige dieser Antworten schienen zu syntaxlastig zu sein, oder sie verursachten Probleme auf meinem Debian-Server. Das hat bei mir perfekt funktioniert:
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.
Wie wäre es mit:
find . -name '*.h' -o -name '*.cpp' -exec grep "CP_Image" {} \; -print
grep -rnw "some thing to grep" --include=*.{module,inc,php,js,css,html,htm} ./
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
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}
# ^^^^^^^^^^^^^^^^^^^
Der einfachste Weg ist
find . -type f -name '*.extension' | xargs grep -i string
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.
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>
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"
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.