Möglicherweise werden die erwarteten Ergebnisse aufgrund des Grep-Filters nicht erreicht. Was ist damit:find . -type f -fprint /dev/stderr -exec cat {} \; | grep some string
artistoex
Was ist das Ziel, das Sie erreichen wollen? Bei der Ausgabe werden Zeichenfolgen aus Dateien abgerufen. Möchten Sie den Pfad dieser Dateien ermitteln?
Mirkobrankovic
Ja, ich möchte den Pfad der Dateien drucken, die die Zeichenfolge 'some string' enthalten. @artistoex Vorschlag druckt alle Dateipfade.
H. Rabiee
Möglicherweise möchten Sie einfach ackalle Dateien im aktuellen Verzeichnis durchsuchen und möglicherweise nur bestimmte Dateitypen filtern.
Jaap Eldering
Antworten:
87
Das liegt daran, dass Sie grepeinen Textstrom einspeisen, der zufällig Dateinamen enthält. Da Sie keine Dateinamen als Argumente für grep angegeben haben, kann nicht davon ausgegangen werden, aus welcher Datei eine übereinstimmende Zeile stammt. Verwendung xargs:
find .-type f -print | xargs grep "some string"
Da Sie GNU find / xargs haben, ist dies eine sicherere Möglichkeit für xargs, Dateinamen zu lesen:
find .-type f -print0 | xargs -0 grep "some string"
Wenn Sie nur die Dateinamen möchten, die eine übereinstimmende Zeile haben, ohne die übereinstimmende Zeile anzuzeigen:
Und -nwenn Sie Zeilennummern wollen. +1 für eine vereinfachte Antwort.
Chad Skeeters
@ChadSkeeters genau. Die Verwendung des Fund gibt keine solche Lösung.
ArcherGodson
1
Dies sollte als die richtige Antwort markiert werden, um ehrlich zu sein. Die aktuell ausgewählte Option beschreibt etwas ganz anderes.
12
Ich suche oft nach Quellcode in komplexen Ordnerstrukturen und finde es nützlich, wenn ich:
cd /your/folder/
grep -rHino "your string"
Mit diesen Parametern erhalte ich ohne Verwendung von find den vollständigen Pfad der Datei und die Zeilennummer , die die angegebene Zeichenfolge enthält .
Es ist auch einfach , weil es sich zu erinnern BASH es durch Ihre Suche wie ein rhino :)
Ich werde anhand eines kurzen Beispiels zeigen, wie das funktioniert.
Lassen Sie uns den Inhalt einer Datei mit cat anzeigen:
Wie Sie in der Ausgabe sehen können, haben wir Dateiname: Trefferzeile: gesuchte Zeichenfolge
Hier ist eine detailliertere Beschreibung der verwendeten Parameter:
-r Liest und verarbeitet rekursiv für jeden Verzeichnisoperanden alle Dateien in diesem Verzeichnis. Befolgen Sie symbolische Links in der Befehlszeile, überspringen Sie jedoch Symlinks, die rekursiv auftreten. Beachten Sie, dass grep das Arbeitsverzeichnis durchsucht, wenn kein Dateioperand angegeben wird. Dies entspricht der Option '--directories = recurse'.
-i Gibt den Dateinamen für jede Übereinstimmung aus. Dies ist die Standardeinstellung, wenn mehr als eine Datei durchsucht werden muss.
-n Stellt jeder Ausgabezeile die 1-basierte Zeilennummer in der Eingabedatei voran. (-n wird von POSIX angegeben.)
-H Gibt den Dateinamen für jede Übereinstimmung aus. Dies ist die Standardeinstellung, wenn mehr als eine Datei durchsucht werden muss.
-o Nur die übereinstimmenden (nicht leeren) Teile der übereinstimmenden Zeilen ausgeben, wobei sich jeder dieser Teile in einer separaten Ausgabezeile befindet. Ausgabezeilen verwenden dieselben Begrenzer wie Eingabe, und Begrenzer sind Nullbytes, wenn auch -z (--null-data) verwendet wird (siehe Andere Optionen).
find . -type f -fprint /dev/stderr -exec cat {} \; | grep some string
ack
alle Dateien im aktuellen Verzeichnis durchsuchen und möglicherweise nur bestimmte Dateitypen filtern.Antworten:
Das liegt daran, dass Sie
grep
einen Textstrom einspeisen, der zufällig Dateinamen enthält. Da Sie keine Dateinamen als Argumente für grep angegeben haben, kann nicht davon ausgegangen werden, aus welcher Datei eine übereinstimmende Zeile stammt. Verwendungxargs
:Da Sie GNU find / xargs haben, ist dies eine sicherere Möglichkeit für xargs, Dateinamen zu lesen:
Wenn Sie nur die Dateinamen möchten, die eine übereinstimmende Zeile haben, ohne die übereinstimmende Zeile anzuzeigen:
quelle
sed '...' $(find ... | xargs grep -l ...)
ich benutze
und es funktioniert schneller
ps
Komplexerer Anwendungsfall
Parametererklärung lesen
quelle
-n
wenn Sie Zeilennummern wollen. +1 für eine vereinfachte Antwort.Ich suche oft nach Quellcode in komplexen Ordnerstrukturen und finde es nützlich, wenn ich:
Mit diesen Parametern erhalte ich ohne Verwendung von find den vollständigen Pfad der Datei und die Zeilennummer , die die angegebene Zeichenfolge enthält .
Es ist auch einfach , weil es sich zu erinnern BASH es durch Ihre Suche wie ein rhino :)
Ich werde anhand eines kurzen Beispiels zeigen, wie das funktioniert.
Lassen Sie uns den Inhalt einer Datei mit cat anzeigen:
Und lassen Sie uns rekursiv nach allen Dateien suchen, die den String "iptables -P" enthalten:
Wie Sie in der Ausgabe sehen können, haben wir Dateiname: Trefferzeile: gesuchte Zeichenfolge
Hier ist eine detailliertere Beschreibung der verwendeten Parameter:
quelle
Ich bevorzugte
| Suchen Sie die Datei | make grep ont finding file | Den vollständigen Pfad der Datei anzeigen
find / -type f -exec grep 'irgendein String' {} \; -exec echo {} \;
quelle
Silver Searcher ist eine sehr schnelle und praktische Anwendung, um nach Dateien und Inhalten zu suchen.
Um Ihr Problem zu lösen, würde der Befehl silver searcher so aussehen ...
ag 'some string' -l
-l
Nur Dateinamen drucken, die Übereinstimmungen enthalten (die übereinstimmenden Zeilen nicht drucken)quelle