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?

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.


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

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.


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.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.