जवाबों:
(की आवश्यकता होती है तब यह प्रयास करें findकी -printfसमर्थन):
find <expr> -type f -printf '.' | wc -c
यह लाइनों की गिनती की तुलना में अधिक विश्वसनीय और तेज होगा।
ध्यान दें कि मैं उपयोग findकी printfहै, न कि एक बाहरी कमांड।
चलो एक बिट बेंच:
$ ls -1
a
e
l
ll.sh
r
t
y
z
मेरा स्निपेट बेंचमार्क:
$ 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
तो मेरा हल तेज है =) (महत्वपूर्ण हिस्सा realलाइन है)
-printf '.'
क्यों नहीं
find <expr> | wc -l
एक सरल पोर्टेबल समाधान के रूप में? आपका मूल समाधान प्रत्येक व्यक्तिगत फ़ाइल के लिए एक नई प्रक्रिया पैदा कर रहा printf है, और यह बहुत महंगा है (जैसा कि आपने अभी पाया है)।
ध्यान दें कि यदि आप नए नाम के साथ फिल्माए गए हैं तो यह ओवरकाउंट करेगा, लेकिन अगर आपके पास ऐसा है तो मुझे संदेह है कि आपकी समस्याएं थोड़ी गहरी हैं।
यह समाधान निश्चित रूप से यहां कुछ अन्य find -> wcसमाधानों की तुलना में धीमा है , लेकिन अगर आप उन्हें गिनने के अलावा फ़ाइल नामों के साथ कुछ और करने के लिए इच्छुक थे, तो आप आउटपुट readसे कर सकते थे find।
n=0
while read -r -d ''; do
((n++)) # count
# maybe perform another act on file
done < <(find <expr> -print0)
echo $n
यह बैशगाइड में पाए जाने वाले एक समाधान का एक संशोधन है जो आउटपुट डेलिमिटर को findएनयूएल बाइट का उपयोग करके गैरमानक नाम वाली फाइलों को ठीक से हैंडल करता है print0, और ''लूप सीमांकक के रूप में (एनयूएल बाइट) का उपयोग करके इसे पढ़ता है।
यह मेरा countfilesकार्य है ~/.bashrc(यह यथोचित रूप से तेज़ है, लिनक्स और फ्रीबीएसडी के लिए काम करना चाहिए find, और न्यूलाइन वर्णों वाले फ़ाइल पथ से मूर्ख नहीं बनता है; अंतिम wcसिर्फ एनयूएल बाइट्स की गणना करता है):
countfiles ()
{
command find "${1:-.}" -type f -name "${2:-*}" -print0 |
command tr -dc '\0' | command wc -c;
return 0
}
countfiles
countfiles ~ '*.txt'