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.