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?
Yanıtlar:
(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)
-printf '.'
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.
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''
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'