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
vorerst, 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?
grep -r -i CP_Image ~/path1/*.{h,cpp}
?ag -i CP_Image ~/path[1-5] | mailx -s GREP [email protected]
. Job erledigt.-r
umgrep
es für Dateien wie die Brüche des UNIX - Mantra mit Werkzeugen suchen zu haben , dass „eine Sache tun und es gut tun“. Es gibt ein perfektes Werkzeug, um Dateien mit einem sehr offensichtlichen Namen zu finden.Antworten:
Verwenden Sie einfach den
--include
Parameter wie folgt:das sollte machen was du willst.
Um die Erklärung aus der Antwort von HoldOffHunger unten zu entnehmen:
grep
: Befehl-r
: rekursiv-i
: Fall ignorieren--include \*.cpp
: all * .cpp: C ++ - Dateien (Escapezeichen mit \ für den Fall, dass Sie ein Verzeichnis mit Sternchen in den Dateinamen haben)./
: Beginnen Sie im aktuellen Verzeichnis.quelle
grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345]
grep -r -i --include="*.h" --include="*.cpp" CP_Image
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 grep ich Dateien unter Linux, aber nur bestimmte Dateierweiterungen?
Nämlich:
... oder Version ohne Berücksichtigung der Groß- und Kleinschreibung ...
grep
: Befehl-r
: rekursiv-i
: Fall ignorieren--include
: all * .txt: Textdateien (Escapezeichen mit \ für den Fall, dass Sie ein Verzeichnis mit Sternchen in den Dateinamen haben)'searchterm'
: Was zu suchen./
: Beginnen Sie im aktuellen Verzeichnis.quelle
*
Verwendung von\*.cpp
oder entkommen'*.cpp'
. Andernfalls wird nicht das erwartete Ergebnis angezeigt, wenn das Arbeitsverzeichnis einige*.txt
Dateien enthält .--include=<pattern>
aber es ist wichtig,*
mit--include <pattern>
(einem Leerzeichen statt=
) zu entkommen, das sich ansonsten sehr ähnlich anfühlt.quelle
--include
Option nach Nadel, nicht mit anderen Optionen?--
?Wie wäre es mit:
quelle
-name
Argumente zu gruppieren . Wenn Sie dies nicht tun, können seltsame Dinge passieren.find . \( -name '*.h' -o -name '*.cpp' \) -exec grep "CP_Image" {} \; -print
find
können optional Argumente gebündelt werden, wodurch Aufrufe des aufgerufenen Prozesses auf ein Minimum reduziert werden.find . \( -name \*.h -o -name \*.cpp \) -exec grep -H CP_Image {} +
Dies wird vorgeschlagen, aber in der Antwort von @ fedorqui unten nicht hervorgehoben und ist eine lohnende Verbesserung. Das-H
hier zu grepende Argument ist nützlich, wenn find nur eine einzige übereinstimmende Datei identifiziert. Dies könnte die Verwendung von-print
in der Antwort eliminieren . Wenn Ihre Gesamtliste der Dateien ausreichend klein ist, ist{path1,path2}/**/*.{cpp,h}
möglicherweise die Verwendung eines rekursiven Shell-Globs (z. B. ) vorzuziehen.Auf HP- und Sun-Servern gibt es keine Option -r. Auf diese Weise hat es auf meinem HP-Server funktioniert
-i ist für die Suche nach Zeichenfolgen ohne Berücksichtigung der Groß- und Kleinschreibung
quelle
ll
aber nicht--color=auto
zu grep.Da es darum geht , Dateien zu finden, verwenden wir
find
!Mit GNU find können Sie die
-regex
Option verwenden, um die Dateien im Verzeichnisbaum zu finden, deren Erweiterung entweder.h
oder ist.cpp
:Dann geht es nur noch darum,
grep
jedes seiner Ergebnisse auszuführen :Wenn Sie diese Verteilung des Funds nicht haben, müssen Sie einen Ansatz wie den von Amir Afghani verwenden ,
-o
um Optionen zu verketten ( der Name endet entweder mit.h
oder mit.cpp
):Und wenn Sie wirklich verwenden möchten
grep
, befolgen Sie die angegebene Syntax--include
:quelle
Der einfachste Weg ist
quelle
ag
(der silberne Sucher) hat dafür eine ziemlich einfache Syntaxdamit
quelle
ag _string_to_find_ -G _filename_regex_
Die folgende Antwort ist gut:
Kann aber aktualisiert werden auf:
Welches kann einfacher sein.
quelle
Sollte "-exec grep" für jeden "-o -name" schreiben
Oder gruppiere sie nach ()
Option '-Hn' zeigt den Dateinamen und die Zeile an.
quelle
Ich bin mir bewusst , diese Frage ist ein bisschen veraltet, aber ich möchte das Verfahren teilen , die ich normalerweise finden verwende .c und .h - Dateien:
oder wenn Sie auch die Zeilennummer benötigen:
quelle