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 .)

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).


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>

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

Nur wenn OP zsh benutzt, aber trotzdem interessant.
Law29


0
find . -name '*.txt' -type f -exec grep <pattern> {} \;

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.