Wie kann ich mit find… -exec grep sowohl den Dateinamen als auch die Zeilennummer zurückgeben?

45

Bei der Verwendung find, wie kehre ich die Dateinamen und die Zeilennummer , wenn nach einer Zeichenfolge gesucht? Es gelingt mir, den Dateinamen in einem Befehl und die Zeilennummern mit einem anderen zurückzugeben, aber ich kann sie scheinbar nicht kombinieren.

Dateinamen: find . -type f -exec grep -l 'string to search' {} \;

Linien Nummern: find . -type f -exec grep -n 'string to search' {} \;

Danny_Joris
quelle

Antworten:

51

Die Befehlszeilenoption -Herzwingt grepdas Drucken des Dateinamens, auch wenn nur eine Datei vorhanden ist.

% grep -n 7 test.in
7:7
% grep -Hn 7 test.in
test.in:7:7

   -H, --with-filename
          Print the filename for each match.

Beachten Sie, dass dies, wie Kojiro in einem Kommentar sagt , nicht Teil des POSIX-Standards ist. Es ist sowohl in GNU als auch in BSD grep enthalten, aber es ist möglich, dass einige Systeme es nicht haben (z. B. Solaris).

Kevin
quelle
4
Diese Antwort könnte verbessert werden, indem darauf hingewiesen wird, dass das -HFlag to grepeine nicht standardmäßige GNU-Erweiterung ist, und ein alternativer Ansatz für Nicht-GNU-Systeme vorgeschlagen wird.
Kojiro
22
find . -type f -exec grep -n 'string to search' /dev/null {} +

(oder mit GNU grep, siehe die -HOption)

Stéphane Chazelas
quelle
beide + und -H funktionieren super, danke!
Danny_Joris
Und im Zusammenhang mit dieser Antwort: unix.stackexchange.com/questions/3682/…
Danny_Joris
4
+1 Richtig, da das Verursachen grepmehrerer Dateinamenargumente die Ausgabe der übereinstimmenden Dateinamen erzwingen würde. Klug!
Kojiro
-1

Wenn Ihr grep das rekursive -rFlag unterstützt, löst dies Ihre Anfrage:

grep -rn "String to search " * 
Jay
quelle
1
Das stimmt, aber ich verstehe nicht, was dies zu den vorhandenen Antworten beiträgt.
Wildcard
Wenn sich im aktuellen Verzeichnis nur eine (Nicht-Punkt-) Datei befindet, wird der Dateiname nicht angezeigt.
G-Man sagt, dass Monica