Geçerli çözümüm find <expr> -exec printf '.' \; | wc -c
olur, ancak bu 10000'den fazla sonuç olduğunda çok uzun sürüyor. Bunu yapmanın daha hızlı/daha iyi yolu yok mu?bash - Bulma sonuçlarını saymanın en iyi yolu nedir?
cevap
Neden basit taşınabilir bir çözüm olarak
find <expr> | wc -l
? Orijinal çözümünüz, bulunan her bir dosya içinprintf
numaralı yeni bir prosesi ortaya çıkaran şeklindedir ve bu çok pahalıdır (yeni bulduğunuz gibi). Bu gömülü satırsonu ile dosya varsa overcount, ancak o zaman senin sorunların yerine bu deneyin
-1: yeni satırlarla dosyada kopacak ve bayt saymadan daha yavaş olacak =) –
Hayır, dosya adının/satırsonu sınırlamasının oldukça az olduğu düşünülen bir indirme hatası olduğunu düşünmüyorum * ve * yukarıda belirtilen. Yavaş ? Belki. Bir dosya sistemini sorguladığınızdan, hız farkının küçük olduğundan şüpheliyim. 10.000 dosyamda 3ms farkını ölçüyorum –
'
:-) biraz daha derin çalıştırmak şüpheli varsa (find
'ın -printf
desteği gerektiren) olacağı
Not:
find <expr> -type f -printf '.' | wc -c
Çizgileri saymadan daha güvenilir ve hızlı olacaktır.
Not: find
'un printf
numarasını kullanın, harici bir komut değil.
edelim tezgah biraz:
$ ls -1
a
e
l
ll.sh
r
t
y
z
Benim pasajı kriter: Tam hatlarıyla
$ time find -type f -printf '.' | wc -c
8
real 0m0.004s
user 0m0.000s
sys 0m0.007s
:
$ time find -type f | wc -l
8
real 0m0.006s
user 0m0.003s
sys 0m0.000s
Yani benim çözüm = hızlıdır) (önemli kısım real
hat)
@RandyHoward Bulunan her bir dosya için bir nokta, bulunan her dosya için bir satıra eşdeğerdir. –
Eşdeğer değil, daha güvenilir =) –
Teşekkürler @MichaelFoukarakis, yeterince yakından bakmadım. Muhtemelen bu kullanım burada çalışmadığı için, -printf şimdi kullanmakta olduğum OS X'de bulmak için geçerli bir seçenek değildir. Bu bir gnu uzantısı mı? Bu işe yarar:
Bu benim countfiles
fonksiyonudur benim ~/.bashrc
(Linux & FreeBSD find
için çalışmalı, makul, hızlıdır ve yeni satır karakterleri içeren dosya yolları tarafından aptal değildir; Nihai wc
sadece NUL bayt) sayar:
countfiles()
{
command find "${1:-.}" -type f -name "${2:-*}" -print0 |
command tr -dc '\0' | command wc -c;
return 0
}
countfiles
countfiles ~ '*.txt'
Bu çözüm burada diğer find -> wc
çözümlerden bazıları daha kesinlikle yavaştır, ancak onları, sizi sayılmasına ek olarak dosya adları ile başka bir şey yapmak eğimli olsaydı , find
çıkışından olabilir.
n=0
while read -r -d ''; do
((n++)) # count
# maybe perform another act on file
done < <(find <expr> -print0)
echo $n
Düzgün print0
kullanarak bir boş karakterle ayırıcı find
çıktısını oluşturmak ve döngü sınırlayıcı olarak ''
(boş karakter) kullanarak ondan okuyarak standart olmayan isimlerle dosyalarını işleme BashGuide bulunan a solution sadece bir değişiklik olduğunu .
Hız yarışmasına katlandığım zamanları seviyorum.wc kullanarak yanlış, ama sürece biz kıyaslama konum olarak hiçbir şey - burada (Sanırım) en çok taşınabilir ve en hızlı çözüm:
$ time find /dev/sd*[a-z] | wc -l
25
real 0m0.006s
user 0m0.000s
sys 0m0.004s
$ time find /dev/sd*[a-z] -printf . | wc -c
25
real 0m0.005s
user 0m0.000s
sys 0m0.000s
: ``
$ time (i=0; for d in /dev/sd*[a-z]; do ((i++)); done; echo $i)
25
real 0m0.001s
user 0m0.000s
sys 0m0.000s
bulmak/wc kullanılmasıyla karşılaştırıldığında
Gizli dosyaları hesaba katmanız gerekiyorsa, for döngüsünüzde 2 argümanınız olması gerektiğini unutmayın: for devfile in /dev/.* /dev/*; do ...
Ve yol daha hızlı kalır.
Mutlu hack!
'find' ve bash globbing aynı değil. Varsayılan olarak kabuk globbing yokken, dizinlerde aramaları bulun. –
@ MechMK1 bu doğru, bu yöntemin hiçbir özyinelemesi olmayacak - muhtemelen neden bu kadar çok daha hızlıdır –
Ayrıca yöntemin çok daha hızlı olduğuna inanıyorum çünkü bash gerçekte globbing'i * genişletir * gerçek yorum çalıştırılır ve , gerçekte eşya bulmak için zaman harcayan süreç 'zaman' çalıştırılmadan önce yapılır. –
- 1. Rails'de saymanın doğru yolu nedir?
- 2. Jmeter'da en iyi yolu bulmanın en iyi yolu nedir?
- 3. core.clj'yi kurmanın en iyi yolu nedir?
- 4. Dosyayı sunucudan indirmenin en iyi yolu nedir
- 5. Ember.js'de olayları işlemenin en iyi yolu nedir?
- 6. Perl'de ekranı temizlemenin en iyi yolu nedir?
- 7. Bir animasyonu sürmenin en iyi yolu nedir?
- 8. Kitaplığı zenginleştirmeyi en iyi yolu scala'da nedir?
- 9. Javascript yürütme işleminin en iyi yolu nedir?
- 10. php'de uluslararasılaşmanın en iyi yolu nedir?
- 11. Nesneleri kapsayıcılarda paylaşmanın en iyi yolu nedir?
- 12. Süreyi saklamanın en iyi yolu nedir? MySQL
- 13. Gözlemlenebilir klonlamanın en iyi yolu nedir?
- 14. Kullanıcı bildirimlerini saklamanın en iyi yolu nedir?
- 15. Denemekten kaçınmanın en iyi yolu nedir?
- 16. ClickOnce dağıtımlarının oluşturulmasının en iyi yolu nedir
- 17. Basit sayılar tanımanın en iyi yolu nedir?
- 18. İç ürünleri oluşturmanın en iyi yolu nedir?
- 19. Python'da HTML işlemenin en iyi yolu nedir?
- 20. DateTime'ı çerezlere depolamanın en iyi yolu nedir?
- 21. en iyi yolu
- 22. Rails Helper'dan birden fazla etiket döndürmenin en iyi yolu nedir?
- 23. Bash'de komut satırı ayrıştırmalarının en iyi yolu nedir?
- 24. JUnit sonuçlarını otomatik olarak xml olarak oluşturmanın en iyi yolu nedir?
- 25. Lucene (java) 'da tüm sonuçları saymanın en hızlı yolu
- 26. Varolan veritabanını sql localdb'ye eklemenin en iyi yolu nedir?
- 27. En yeni glibc gerektirmeyen yazılımlar oluşturmanın en iyi yolu nedir?
- 28. Kendi GPG/PGP parolanızı güçlendirmek için en iyi yolu kullanmanın en iyi yolu nedir?
- 29. en iyi yolu?
- 30. en iyi yolu
Arama sonuçlarında wc -l'yi kullanın –