Jumlah file yang berisi string yang diberikan

19

Bagaimana saya bisa menghitung jumlah file (dalam direktori) yang berisi string yang diberikan sebagai input di bash / sh?

Bintang laut
sumber

Jawaban:

30

grep -l "string" * | wc -l akan mencari "string" di isi semua file di direktori kerja dan memberi tahu Anda berapa banyak yang cocok.

Serigala
sumber
1
Ini tidak akan berfungsi jika ada banyak file di direktori, itu akan membuang kesalahan "zsh: daftar argumen terlalu panjang: grep". Ada ide tentang cara menghilangkan ini?
1
@ user16142 grep direktori bukan file: grep -lr "string" directory | wc -lJika Anda tidak ingin pencarian rekursif, Anda dapat menggunakan find dengan opsi maxdepth: find directory -maxdepth 1 -type f -exec grep -l "string" {} + | wc -lPerhatikan bahwa opsi kedua ini lebih lambat dari grep.
Agargara
9

grepParameter s -lhanya akan menampilkan nama file yang cocok $PATTERN, wcdapat menghitungnya sesudahnya.

grep -l "$PATTERN" * | wc -l
mengibaskan
sumber
terima kasih, tetapi bertanya-tanya dengan pola dalam file ... maaf untuk pertanyaan yang ambigu
Jika demikian, ambil jawaban Wolf.
Mengibaskan
3
awk '/pattern_to_look_for/ {s+=1; nextfile;} END {print s}' *

Klarifikasi: Ini mencari jumlah file yang memiliki "pattern_to_look_for" dalam isinya dan tidak dalam nama file mereka (seperti jawaban Wag). Dari pertanyaan Anda, sulit untuk mengatakan apa yang Anda cari.

Jan Persson
sumber
Tapi ada yang hilang? karena tidak berfungsi
Jika Anda mencari string duck, Anda harus menuliskannya seperti / duck / di Awk. Apakah kamu melakukan itu?
Jan Persson
ya, output: awk: read error (Is a directory)
Jawaban Wolf akan memberi Anda duplikat. Jika ada beberapa kemunculan string yang Anda cari di salah satu file, itu akan dihitung sebagai kecocokan tambahan.
Jan Persson
Nah, jika Anda memiliki direktori di folder Anda harus melakukan beberapa hal tambahan seperti mengganti bintang dengan sesuatu seperti ini find . ! -name . -prune -type f(jangan lewatkan backticks). Perintah ini hanya mencantumkan file dalam folder.
Jan Persson
2

Ini berfungsi di Bash dengan nama file apa pun :

grep -lZ "$pattern" * | tr -cd '\000' | wc -c

Penjelasan:

  • grep's -Zpilihan mencetak setiap hasil dengan pemisah ␀-byte. Karakter ini tidak dapat menjadi bagian dari nama file, jadi kita bisa menghitung jumlah pemisah untuk mendapatkan jumlah file.
  • Untuk menghilangkan karakter lain dalam output, kami cukup menghapus semuanya kecuali ␀ byte yang digunakan tr.
  • Kemudian hitung saja karakter dengan wc.
l0b0
sumber