find . -name '*.py' -exec grep something {} \; -print
akan mencetak nama file setelah baris yang cocok.
find . -name '*.py' -exec grep something /dev/null {} +
akan mencetak nama file di depan setiap baris yang cocok (kami menambahkan /dev/null
untuk kasus di mana hanya ada satu file yang cocok karena grep
tidak mencetak nama file jika hanya melewati satu file untuk melihat. Implementasi GNU grep
memiliki -H
opsi untuk itu sebagai alternatif).
find . -name '*.py' -exec grep -l something {} +
hanya akan mencetak nama file dari file yang memiliki setidaknya satu baris yang cocok.
Untuk mencetak nama file sebelum baris yang cocok, Anda bisa menggunakan awk sebagai gantinya:
find . -name '*.py' -exec awk '
FNR == 1 {filename_printed = 0}
/something/ {
if (!filename_printed) {
print FILENAME
filename_printed = 1
}
print
}' {} +
Atau panggil grep
dua kali untuk setiap file - meskipun itu akan kurang efisien karena akan menjalankan setidaknya satu grep
perintah dan hingga dua untuk setiap file (dan membaca konten file dua kali):
find . -name '*.py' -exec grep -l something {} \; \
-exec grep something {} \;
Bagaimanapun, Anda tidak ingin mengulang-ulang output find
seperti itu dan ingat untuk mengutip variabel Anda .
Jika Anda ingin menggunakan shell loop, dengan alat GNU:
find . -name '*.py' -exec grep -l --null something {} + |
xargs -r0 sh -c '
for file do
printf "%s\n" "$file"
grep something < "$file"
done' sh
(juga berfungsi pada FreeBSD dan turunannya).