2013-07-02 09:24:45 +0000 2013-07-02 09:24:45 +0000
83
83

Suchen von Dateien, die eine bestimmte Zeichenfolge enthalten, mit find (1) und grep (1)

find . -type f -print -exec cat {} \; | grep some string

Der obige Befehl gibt den Dateipfad nicht aus.

Ich verwende: Ubuntu, bash 4.

Antworten (5)

117
117
117
2013-07-02 12:01:16 +0000

Ich verwende

grep "some string" . -R

und es funktioniert schneller

p.s.

Komplexer Anwendungsfall

grep -HiRE "some string|other string" . #H for file printing, i for case-insensitive, R for recursive search, E for regex

Zum Lesen von Param i Erklärung

grep --help | grep -- -i
98
98
98
2013-07-02 10:02:41 +0000

Das liegt daran, dass Sie grep mit einem Textstrom füttern, der nur zufällig Dateinamen enthält. Da Sie keine Dateinamen als Argumente für grep angegeben haben, kann nicht erwartet werden, dass es ableitet, aus welcher Datei eine übereinstimmende Zeile stammt. Verwenden Sie xargs:

find . -type f -print | xargs grep "some string"

Da Sie GNU find/xargs haben, ist dies ein sicherer Weg für xargs, Dateinamen zu lesen:

find . -type f -print0 | xargs -0 grep "some string"

Wenn Sie nur die Dateinamen wollen, die eine übereinstimmende Zeile haben, ohne die übereinstimmende Zeile anzuzeigen:

find . -type f -print0 | xargs -0 grep -l "some string"
14
14
14
2014-09-26 13:24:22 +0000

Ich suche oft nach Quellcode in komplexen Ordnerstrukturen und finde es nützlich, diese zu verwenden:

cd /your/folder/
grep -rHino "your string"

Mit diesen Parametern erhalte ich, ohne find zu verwenden, den vollständigen Dateipfad und die Zeilennummer, die die angegebene Zeichenkette enthält.

Es ist auch leicht zu merken, weil es wie ein rHino durch die Suche BASHgeht :)

Ich werde anhand eines kurzen Beispiels zeigen, wie das funktioniert.

Lassen wir uns den Inhalt einer Datei mit cat anzeigen:

jeeves ~ # cat fw.stop
#!/bin/sh
echo "Stopping firewall and allowing everyone..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

Und lassen Sie uns rekursiv nach allen Dateien suchen, die die Zeichenkette “iptables -P” enthalten:

jeeves ~ # grep -rinHo "iptables -P"
fw.stop:9:iptables -P
fw.stop:10:iptables -P
fw.stop:11:iptables -P

Wie Sie in der Ausgabe sehen können, haben wir Dateiname:Trefferzeile:gesuchte Zeichenkette

Hier ist eine genauere Beschreibung der verwendeten Parameter:

-r Für jeden Verzeichnisoperanden werden alle Dateien in diesem Verzeichnis rekursiv gelesen und verarbeitet. Folgen Sie symbolischen Links in der Befehlszeile, aber überspringen Sie Symlinks, die rekursiv angetroffen werden. Beachten Sie, dass grep das Arbeitsverzeichnis durchsucht, wenn kein Dateioperand angegeben wird. Dies ist dasselbe wie die Option ‘–directories=recurse’.

-i Gibt den Dateinamen für jede Übereinstimmung aus. Dies ist die Standardeinstellung, wenn es mehr als eine Datei zu durchsuchen gibt.

-n Jeder Ausgabezeile wird die 1-basierte Zeilennummer innerhalb der Eingabedatei vorangestellt. (-n ist von POSIX vorgegeben.)

-H Gibt den Dateinamen für jeden Treffer aus. Dies ist die Standardeinstellung, wenn mehr als eine Datei zu durchsuchen ist.

-o Gibt nur die übereinstimmenden (nicht leeren) Teile der übereinstimmenden Zeilen aus, wobei jeder dieser Teile in einer eigenen Ausgabezeile steht. Die Ausgabezeilen verwenden die gleichen Begrenzungszeichen wie die Eingabe, und die Begrenzungszeichen sind Null-Bytes, wenn auch -z (–null-data) verwendet wird (siehe Andere Optionen).

2
2
2
2015-10-28 19:03:56 +0000

Ich bevorzugte

| die Datei finden |make grep ont finding file | show de full path of the file

find / -type f -exec grep ‘some string’ {} \; -exec echo {} \;

0
0
0
2018-10-22 16:15:38 +0000

Silver Searcher ist ein sehr schnelles und praktisches Tool, um nach Dateien und Inhalten zu suchen.

Um Ihr Problem zu lösen, würde der Silver Searcher-Befehl wie folgt aussehen…

ag 'some string' -l

-l Nur Dateinamen ausgeben, die Treffer enthalten (nicht die passenden Zeilen ausgeben)