औसत फ़ाइल आकार की गणना करें


11

मैं एक निर्देशिका में औसत फ़ाइल आकार की गणना के लिए एक आसान एक-लाइनर की तलाश कर रहा हूं।

मुझे क्या चाहिए:

निर्देशिका में सभी फ़ाइलों / फ़ाइलों की संख्या का आकार


निर्देशिका में प्रत्येक फ़ाइल के औसत आकार में? या निर्देशिका का आकार?
ड्रेक क्लेरिस

एक निर्देशिका में एक फ़ाइल के औसत आकार
taffer

जवाबों:


3

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, awkANSI C दृश्यों का विस्तार होगा के रूप में \n, \r... जबकि गोले निर्यात कर PWD, तो आप उपयोग कर सकते हैं ENVIRON["PWD"]में awkजो उनके नाम के बैकस्लैश होने निर्देशिकाओं के लिए समस्या उस तरह का नहीं है।
स्टीफन चेज़लस

यदि आपको बस बाइट्स में औसत आकार की आवश्यकता है, तो आप उपयोग कर सकते हैं find . -type f -exec stat -f%z {} +|awk '{s+=$0}END{print s/NR}'
लैरी

11

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))

3

एक लाइन में एक सरलीकृत समाधान:

ls -Rl -- "$DIR" | awk 'BEGIN{sum=0;count=0};/^-/{sum+=$5;++count};END{print sum/count}'

इसमें एक वाक्यात्मक धोखा है, केवल ls'-' से शुरू होने वाली आउटपुट लाइनों पर विचार करते हुए, जो नियमित फ़ाइलों के लिए डेटा का गठन करना चाहिए।


2

केवल एक निर्देशिका में फ़ाइलों के लिए, उप निर्देशिकाओं की अनदेखी:

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)

मैं उप निर्देशिकाओं को अनदेखा नहीं करना चाहूंगा।
टैफर

अच्छा। बस 512ktes (kb) के बजाय 1024bytes (kb) में परिणाम प्राप्त करने के लिए-du du मंगलाचरण में जोड़ें (एक फ़ाइल चंक का डिफ़ॉल्ट आकार)।
ओलिवियर दुलक

2
du -sसभी फ़ाइलों और निर्देशिकाओं और अन्य गैर-नियमित फ़ाइलों के डिस्क उपयोग (नहीं आकार) को जोड़ देगा , एक ही फ़ाइल के अतिरिक्त हार्ड लिंक को छोड़कर, जबकि सभी नियमित फ़ाइलों की गणना करेगा। इसके अलावा, नईलाइन वर्ण वाले फ़ाइल नाम कई बार गिने जाएंगे। जीएनयू विशिष्ट है। OS के आधार पर क्षेत्रों या किलोबाइट की रिपोर्ट करेगा। finddu -Sdu -s
स्टीफन चेजेलस

हमेशा की तरह @StephaneChazelas के बारे में आपका ज्ञान linux / unix मुझे चकित करता है और मुझे दिखाता है कि मेरे त्वरित और गंदे समाधान कितने गंदे हैं। आप कब से लिनक्स / यूनिक्स का उपयोग कर रहे हैं?
ड्रेक क्लेरिस

उत्तर बुरी तरह से गलत है और इसे हटा दिया जाना चाहिए। स्टीफन द्वारा समझाया गया।
एक्यूमेनस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.