Rekursive Textsuche mit Grep- und Dateimustern

46

In diesem Beispiel Ordnerstruktur:

/folder1/file1.txt
/folder1/file2.djd
/folder2/file3.txt
/folder2/file2.fha

Wie mache ich eine rekursive Textsuche für alle *.txtDateien mit grep"/"?

( "grep -r <pattern> *.txt"schlägt fehl, wenn von "/" ausgeführt wird, da sich .txtin diesem Ordner keine Dateien befinden .)

Anders Sandvig
quelle

Antworten:

61

Meine Version von GNU Grep hat einen Schalter dafür:

grep -R --include='*.txt' $Pattern

Beschrieben wie folgt:

--include=GLOB

Durchsuchen Sie nur Dateien, deren Basisname mit GLOB übereinstimmt (mithilfe der Platzhalterübereinstimmung, wie unter --exclude beschrieben).

Kyle Brandt
quelle
19

Wenn Sie über eine große Anzahl von Dateien verfügen, ist es hilfreich, xargs in den Befehl aufzunehmen, um den Fehler "Argumentliste zu lang" zu vermeiden.

find . -name '*.txt' -print | xargs grep <pattern>
Kennzeichen
quelle
6
Wenn die Datei- oder Verzeichnisnamen Leerzeichen enthalten, verwenden Sie das folgende Formular: find. -name '* .txt' -print0 | xargs -0 grep <pattern>
Jason Luther
2
Und natürlich gibt es die Ausgabe von Dateinamen, die mit beginnen -.
TJ Crowder
grepist schneller von find.
Nabi KAZ
2

Sie könnten in der Lage sein Einsatz Ihrer machen zsh‚s - EXTENDED_GLOBOption ( docs )

grep <pattern> **/*.txt
Santa
quelle
Nur wenn OP zsh benutzt, aber trotzdem interessant.
Law29
1

Vielleicht möchten Sie sich ack unter http://betterthangrep.com ansehen , wo Sie Dateien nach Dateityp suchen können.

Andy Lester
quelle
0
find . -name '*.txt' -type f -exec grep <pattern> {} \;
innaM
quelle
Vielleicht möchten Sie stattdessen "find. -name '* .txt' -type f -exec grep <pattern> {} +" verwenden, damit es sich eher wie die von Mark Robinson verwendete Version verhält - funktioniert meines Wissens nur mit GNU find
Serverhorror
0

Mannis Antwort würde für jede Textdatei einen neuen Grep-Prozess auslösen. Wenn Sie dort viele Textdateien haben, können Sie jede Datei zuerst prüfen und die TXT-Dateien auswählen, wenn dies erledigt ist:

grep -r <pattern> * | grep \.txt:

Das ist zwar festplattenintensiver, könnte aber trotzdem schneller sein.

Kommandant Keen
quelle
0

Es ist 2019 und es gibt keine Möglichkeit, Grep für die rekursive Textsuche zu verwenden.

IMHO heutigen Antworten sollten Ripgrep enthalten :

rg <pattern> -ttxt
Santa
quelle