मैं एक निर्देशिका में औसत फ़ाइल आकार की गणना के लिए एक आसान एक-लाइनर की तलाश कर रहा हूं।
मुझे क्या चाहिए:
निर्देशिका में सभी फ़ाइलों / फ़ाइलों की संख्या का आकार
मैं एक निर्देशिका में औसत फ़ाइल आकार की गणना के लिए एक आसान एक-लाइनर की तलाश कर रहा हूं।
मुझे क्या चाहिए:
निर्देशिका में सभी फ़ाइलों / फ़ाइलों की संख्या का आकार
जवाबों:
FreeBSD / Mac OS X के साथ find
, stat
और awk
(बिलकुल नहीं , हालांकि एक आसान वन-लाइनर):
find -x . -type f -maxdepth 1 -exec sh -c 'stat -f '%z' "${@}"' _ '{}' + |
LC_ALL=C awk -v pwd="${PWD}" '
BEGIN{ sum=0; count=0; }
{ sum+=$1; ++count; }
END{
if (count == 0) exit;
printf ("number of files: %d\n", count);
printf ("average file size in B: %.5f\n", sum/count);
printf ("average file size in KB: %.5f\n", (sum/count) / 1024);
printf ("average file size in MB: %.5f\n", (sum/count) / (1024*1024));
printf ("directory: %s\n", pwd);
}
'
-v var=value
, awk
ANSI C दृश्यों का विस्तार होगा के रूप में \n
, \r
... जबकि गोले निर्यात कर PWD
, तो आप उपयोग कर सकते हैं ENVIRON["PWD"]
में awk
जो उनके नाम के बैकस्लैश होने निर्देशिकाओं के लिए समस्या उस तरह का नहीं है।
find . -type f -exec stat -f%z {} +|awk '{s+=$0}END{print s/NR}'
।
GNU खोज के साथ:
find . -type f -printf '%s\n' | awk '{s+=$0}
END {printf "Count: %u\nAverage size: %.2f\n", NR, s/NR}'
या डिस्क उपयोग के लिए:
find . -type f -printf '%k\n' | awk '{s+=$0}
END {printf "Count: %u\nAverage size: %.2f\n", NR, s*1024/NR}'
ध्यान दें कि अगर वहाँ एक ही फ़ाइल के कई हार्डलिंक हैं, तो यह कई बार इसके डिस्क उपयोग की गणना करेगा।
ऊपर केवल नियमित फ़ाइलों को गिना जाता है, न कि सहानुभूति या निर्देशिका या अन्य विशेष फाइलें। इसमें छिपी हुई फाइलें शामिल हैं।
zsh
बिल्डिंस के साथ भी ऐसा ही :
zmodload -i zsh/stat
count() {zstat -Hs -- $REPLY; ((size+=$s[size], count++, 0))}
size=0 count=0
**/*(oNDN.+count)
print -f "Count: %s\nAverage size: %.2f\n" $count $(($size./count))
एक लाइन में एक सरलीकृत समाधान:
ls -Rl -- "$DIR" | awk 'BEGIN{sum=0;count=0};/^-/{sum+=$5;++count};END{print sum/count}'
इसमें एक वाक्यात्मक धोखा है, केवल ls
'-' से शुरू होने वाली आउटपुट लाइनों पर विचार करते हुए, जो नियमित फ़ाइलों के लिए डेटा का गठन करना चाहिए।
केवल एक निर्देशिका में फ़ाइलों के लिए, उप निर्देशिकाओं की अनदेखी:
expr $(du -Ss | cut -f1) / $(find /path/to/dir -maxdepth 1 -type f | wc -l)
या उपनिर्देशिकाओं में फ़ाइलों सहित सभी फाइलों की गणना करने के लिए:
expr $(du -s | cut -f1) / $(find /path/to/dir -type f | wc -l)
du -s
सभी फ़ाइलों और निर्देशिकाओं और अन्य गैर-नियमित फ़ाइलों के डिस्क उपयोग (नहीं आकार) को जोड़ देगा , एक ही फ़ाइल के अतिरिक्त हार्ड लिंक को छोड़कर, जबकि सभी नियमित फ़ाइलों की गणना करेगा। इसके अलावा, नईलाइन वर्ण वाले फ़ाइल नाम कई बार गिने जाएंगे। जीएनयू विशिष्ट है। OS के आधार पर क्षेत्रों या किलोबाइट की रिपोर्ट करेगा। find
du -S
du -s