"Bul" sonuçlarını saymanın en iyi yolu nedir?


101

Mevcut çözümüm olabilir find <expr> -exec printf '.' \; | wc -c, ancak 10000'den fazla sonuç olduğunda bu çok uzun sürüyor. Bunu yapmanın daha hızlı / daha iyi bir yolu yok mu?


Bulgu sonuçlarınız için wc -l kullanın
Manuel Selva

Yanıtlar:


88

(Gerektirmeyen Bu yolu deneyin finds' -printfdestek):

find <expr> -type f -printf '.' | wc -c

Satırları saymaktan daha güvenilir ve hızlı olacaktır.

Harici bir komut değil find's' i kullandığımı unutmayın printf.


Biraz tezgah yapalım:

$ ls -1
a
e
l
ll.sh
r
t
y
z

Snippet karşılaştırmam:

$ time find -type f -printf '.' | wc -c
8

real    0m0.004s
user    0m0.000s
sys     0m0.007s

Tam satırlarla:

$ time find -type f | wc -l
8

real    0m0.006s
user    0m0.003s
sys     0m0.000s

Yani benim çözümüm daha hızlı =) (önemli kısım realçizgi)


6
Eşdeğer değil, bu) = daha güvenilirdir
Gilles Quenot

6
Bulunacak -printf bayrağının platformunuzda desteklenmemesi daha güvenilir değildir. ;-)
Randy Howard

7
Noktadan alıntı yapmayarak birkaç nanosaniye daha tıraş edebileceğinizi unutmayın-printf '.'
Jens

6
@Jens - özellikle dikkate o tip için alınan zaman alacak zaman
Brian Agnew

6
Bu kadar küçük bir ölçütle, zamanlamalara muhtemelen ölçmek istediğiniz şeyden başka faktörler hakimdir. Büyük bir ağaçla yapılacak bir deney daha faydalı olacaktır. Ama bu, OP'nin istediğini gerçekten yapmak için oyumu alıyor.
üçlü

134

Neden olmasın

find <expr> | wc -l

basit bir taşınabilir çözüm olarak? Orijinal çözümünüz, bulunan her bir dosya için yeni bir süreç üretiyor printf ve bu çok pahalı (yeni bulduğunuz gibi).

Satır satırları gömülü dosya adlarınız varsa bunun fazla sayılacağını unutmayın, ancak buna sahipseniz, sorunlarınızın biraz daha derin olduğundan şüpheleniyorum.


9
-1: satır satırları içeren dosyada
kesilir ve

23
Dosya adı / satırsonu sınırlamasının oldukça nadir olduğu ve yukarıda belirtildiği göz önüne alındığında, bunun bir olumsuz oylama gerektirdiğini sanmıyorum . Yavaş ? Belki. Bir dosya sistemini sorguladığınız için, hız farkının küçük olduğundan şüpheleniyorum. 10.000 dosyam arasında 3 ms'lik farkı ölçüyorum
Brian Agnew

8
'<expr> bul | wc -l' ve '<expr> bul -printf arasındaki performans farkı. | wc -c 'çok küçük. Önbelleğe alma (yani aynı bulmayı aynı ağaç üzerinde iki kez çalıştırırsanız) çok daha önemlidir. IMHO "wc -l" çözümü çok daha sezgiseldir.
pitseeker

5

Bu çözüm kesinlikle buradaki diğer find -> wcçözümlerden bazılarından daha yavaştır , ancak dosya adlarını saymanın yanı sıra dosya adlarıyla başka bir şey yapmaya meyilli olsaydınız read, findçıktıdan yapabilirsiniz.

n=0
while read -r -d ''; do
    ((n++)) # count
    # maybe perform another act on file
done < <(find <expr> -print0)
echo $n

Bu, BashGuide'da bulunan ve çıktı sınırlayıcıyı döngü sınırlayıcı olarak (NUL bayt) kullanarak ve ondan okuyarak bir NUL baytı yaparak standart olmayan adlara sahip dosyaları düzgün bir şekilde işleyen bir çözümün bir modifikasyonudur .findprint0''


4

Bu benim countfilesfonksiyonumdur ~/.bashrc(oldukça hızlıdır, Linux ve FreeBSD için çalışmalıdır findve satırsonu karakterleri içeren dosya yolları tarafından yanıltılmaz; son wcsadece NUL baytlarını sayar):

countfiles () 
{ 
   command find "${1:-.}" -type f -name "${2:-*}" -print0 | 
       command tr -dc '\0' | command wc -c;
return 0
}

countfiles

countfiles ~ '*.txt'
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.