Bagaimana cara mengembalikan nama file dan nomor baris dengan find… -exec grep?

45

Saat menggunakan find, bagaimana cara mengembalikan nama file dan nomor baris saat mencari string? Saya berhasil mengembalikan nama file dalam satu perintah dan nomor baris dengan yang lain, tapi sepertinya saya tidak bisa menggabungkannya.

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

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

Danny_Joris
sumber

Jawaban:

51

Saklar baris perintah -Hmemaksa grepuntuk mencetak nama file, bahkan hanya dengan satu file.

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

Perhatikan bahwa seperti yang dikatakan Kojiro dalam komentar , ini bukan bagian dari standar POSIX; itu ada di grep GNU dan BSD, tetapi mungkin beberapa sistem tidak memilikinya (mis. Solaris).

Kevin
sumber
4
Jawaban ini dapat ditingkatkan dengan menunjukkan bahwa -Hflag to grepadalah ekstensi GNU yang tidak standar dan mengajukan pendekatan alternatif untuk sistem non-GNU.
kojiro
22
find . -type f -exec grep -n 'string to search' /dev/null {} +

(atau dengan GNU grep, lihat -Hopsi)

Stéphane Chazelas
sumber
baik + dan -H bekerja dengan baik, terima kasih!
Danny_Joris
Dan terkait dengan jawaban ini: unix.stackexchange.com/questions/3682/…
Danny_Joris
4
+1 Benar, karena menyebabkan grepmemiliki beberapa nama file, args akan memaksanya untuk menampilkan nama file yang cocok. Pintar!
kojiro
-1

Jika grep Anda mendukung tanda rekursif -r, ini menyelesaikan permintaan Anda:

grep -rn "String to search " * 
Jay
sumber
1
Itu benar, tetapi saya tidak melihat apa ini menambah jawaban yang ada.
Wildcard
Dan jika hanya ada satu file (non-dot) di direktori saat ini, ini tidak menampilkan nama file.
G-Man Mengatakan 'Reinstate Monica'