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 find
s' -printf
destek):
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 .find
print0
''
Bu benim countfiles
fonksiyonumdur ~/.bashrc
(oldukça hızlıdır, Linux ve FreeBSD için çalışmalıdır find
ve satırsonu karakterleri içeren dosya yolları tarafından yanıltılmaz; son wc
sadece 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'