grep - daftar nama file tempat ditemukannya kecocokan

31

Saya memiliki banyak file .html di direktori. Saya ingin melihat-lihat setiap file dan mencocokkan pola (MD5). Semua itu cukup mudah. Masalahnya adalah saya perlu tahu file apa yang cocok dengan yang ditemukan.

cat *.html | grep 75447A831E943724DD2DE9959E72EE31

Hanya mengembalikan konten halaman HTML tempat kecocokan ditemukan, tetapi tidak memberi tahu saya file tempat ditemukannya. Bagaimana saya bisa mendapatkan grep untuk menunjukkan kepada saya nama file tempat kecocokan saya ditemukan?

Menjadi teman saya
sumber
Saran yang diberikan benar-benar tidak berfungsi .... Yang saya dapatkan hanyalah 'input standar' cat * .html | grep -i -H 1ee024007823cc0bfbefba98ba1e1f4c (input standar): <html> <head> <title>
BeMy Friend
4
Anda melewatkan intinya. Anda tidak perlu menggunakan kucing. Kucing mencegah grep dari membedakan file individual.
muru
Anda mungkin menemukan posting Stack Overflow ini berguna .
Pablo A

Jawaban:

32
grep -H 75447A831E943724DD2DE9959E72EE31 *.html

-H, --with-filename
              Print the file name for each match. This is
              the default when there is more than one file
              to search.
Cyrus
sumber
3
Seperti dikatakan, itu adalah default untuk banyak file, jadi selama ada lebih dari satu file html, -Htidak perlu.
muru
1
Maaf pertanyaan saya menyinggung. Saya seharusnya mengatakan saya telah mengerjakan ini untuk sementara waktu dan saya telah menggunakan sejumlah switch DAN telah membaca halaman MAN di mana dikatakan daftar nama file secara default .... Tapi apa yang saya dapatkan adalah (input standar ) di mana ia harus mencantumkan nama file.
BeMy Friend
dan itu hanya jika saya memberikan saklar -H. Jika saya hanya melakukan apa yang saya daftarkan di OP, maka itu tidak memberikan nama file.
BeMy Friend
3
@BeMyFriend, masalahnya adalah cat. catberarti gabungan. Jika Anda menggabungkan semua file ke file sebelum meneruskannya grep, greplihat hanya satu file input standar besar dan tidak bisa (singkat melakukan ramalan) memberi Anda kembali informasi tentang file tunggal. Lihat?. Cyrus, bagaimana dengan menjelaskan ini dalam jawabannya?
Rmano
OK, masalahnya adalah perintah kucing, tetapi apa yang bisa menjadi solusi?
Josef Klimuk
21

Saya menggunakan ini sepanjang waktu untuk mencari file yang berisi string, secara berulang dalam direktori (itu berarti, melintasi sub folder sub apa saja) grep -Ril "yoursearchtermhere"

  • R adalah mencari secara rekursif (mengikuti symlink)
  • i adalah untuk membuatnya tidak sensitif
  • l hanya untuk daftar nama file.

jadi menjawab pertanyaan Anda grep -l '75447A831E943724DD2DE9959E72EE31' *.htmlakan dilakukan tetapi Anda bisa melakukannya grep -Ril '75447A831E943724DD2DE9959E72EE31'untuk mencari string itu, tidak peka huruf besar-kecil, dalam file apa pun dalam subfolder apa pun

pencari jendela
sumber
macOS selalu membutuhkan def, semoga saja wildcard. Jika tidak, ia mengasumsikan input dari stdin( grep: warning: pencarian stdin rekursif, input stdin rekursif apa pun artinya :-). Dengan kata lain:grep -Ril 'texttofind' *
Ville
grep -RiH 'pattern'menunjukkan nama file dan baris yang cocok
Ikrom
7

Anda bisa mencoba ini

grep -rl '75447A831E943724DD2DE9959E72EE31' * > found.txt
Aura merah
sumber
2
grep -r -H 75447A831E943724DD2DE9959E72EE31 *.html | awk -F : ' { print $1 } '

Alternatif untuk

grep -r -l 75447A831E943724DD2DE9959E72EE31 *.html

Melakukan di atas akan mencari secara rekursif dalam folder dan subfolder dan mencetak path file ...

Drew
sumber
grep -r -l adalah satu-satunya hal yang berhasil padaku.
Josef Klimuk
0

Jawaban yang diposting oleh Cyrus benar-benar tepat dan adalah The Right Way TM untuk melakukannya grepjika kita hanya perlu menemukan file . Ketika nama file perlu penguraian atau operasi tambahan pada nama file yang cocok, kita dapat menggunakan whileloop dengan ifpernyataan. Berikut adalah contoh di mana daftar nama file berasal dari struktur find+ yang sangat umum digunakan whileuntuk penguraian nama file yang aman.

find -type f -name "*.html" -print0 | while IFS= read -r -d '' filename
do
    if grep -q 'PATTERN' "$filename"
    then
        printf "%s found in %s\n" 'PATTERN' "$filename"
        # Here we can insert another command or function
        # to perform other operations on the filename
    fi
done
Sergiy Kolodyazhnyy
sumber
1
Terkait: Secara rekursif mencari pola / teks hanya dalam nama file yang ditentukan direktori? , Terutama jawaban Muru ini menunjukkan grep's --includebendera.
Eliah Kagan