Belirli bir dizeyi içeren dosya sayısı


19

Belirli bir dizeyi içeren dosya sayısını (dizinde) bash / sh biçiminde girdi olarak nasıl sayabilirim?

Yanıtlar:


30

grep -l "string" * | wc -l çalışma dizinindeki tüm dosyaların içeriğinde "string" i arayacak ve size kaç tanesinin eşleştiğini söyleyecektir.


1
Dizinde çok fazla dosya varsa bu çalışmaz, "zsh: argüman listesi çok uzun: grep" hatasını atar. Bundan nasıl kurtulacağına dair bir fikrin var mı?

1
@ user16142 dosyalar yerine dizini grep: grep -lr "string" directory | wc -lÖzyinelemeli arama istemiyorsanız, maxdepth seçeneği ile find komutunu kullanabilirsiniz: find directory -maxdepth 1 -type f -exec grep -l "string" {} + | wc -lBu ikinci seçeneğin grep'ten daha yavaş olduğunu unutmayın.
Agargara

9

greps parametresi -lsadece çıkış eşleştirme olan dosya olacak $PATTERN, wcsonradan onları sayabilir.

grep -l "$PATTERN" * | wc -l

teşekkürler, ama dosyada bir desen ile merak ediyordum ... belirsiz soru için üzgünüm

Eğer öyleyse, Wolf'un cevabını al.
wag

3
awk '/pattern_to_look_for/ {s+=1; nextfile;} END {print s}' *

Açıklama: Dosya adlarında değil (Wag'in yanıtı gibi) içeriklerinde "pattern_to_look_for" bulunan dosya sayısını arar. Sorunuzdan ne aradığınızı söylemek zor.


Ama bir şey eksik mi? çünkü çalışmıyor

Eğer dize ördek ararsanız Awk / duck / gibi yazmalısınız. Bunu yapıyor musun?
Jan Persson

evet, çıktı: awk: okuma hatası (Bir dizin mi)

Wolf'un cevabı size kopyalar verecektir. Dosyalardan birinde aradığınız dizenin birkaç yinelemesi varsa, ek eşleşmeler olarak sayılır.
Jan Persson

Eğer klasörde dizin varsa Eh, yıldızı böyle bir şey ile değiştirmek gibi bazı ekstra şeyler find . ! -name . -prune -type fyapmak zorunda (backticks kaçırmayın). Bu komut yalnızca klasördeki dosyaları listeler.
Jan Persson

2

Bash'de herhangi bir dosya adıyla çalışır :

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

Açıklama:

  • grepbireyin -Zseçenek ␀ bayt ayırıcı ile her sonucu yazdırır. Bu karakter bir dosya adının parçası olamaz, bu nedenle dosya sayısını almak için ayırıcıların sayısını sayabiliriz.
  • Çıktıdaki diğer karakterlerden kurtulmak için ␀ bayt dışındaki her şeyi kaldırıyoruz tr.
  • Sonra ile karakterleri sayın wc.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.