গড় পরিমাণ ফাইলের আকার


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 সি সিকোয়েন্স প্রসারিত হবে যেমন \n, \r... যদিও শাঁস রপ্তানি না PWD, তাই আপনি ব্যবহার করতে পারেন ENVIRON["PWD"]মধ্যে awkযা তাদের নামে ব্যাকস্ল্যাশ থাকার ডিরেক্টরি জন্য সমস্যা যে ধরনের নেই।
স্টাফেন চেজেলাস

আপনার যদি কেবল বাইটগুলিতে গড় আকারের প্রয়োজন হয় তবে আপনি ব্যবহার করতে পারেন find . -type f -exec stat -f%z {} +|awk '{s+=$0}END{print s/NR}'
ল্রি

11

জিএনইউ সহ:

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)

আমি সাব ডিরেক্টরি উপেক্ষা করতে চাই না।
তাফার

সুন্দর। 512bytes (একটি ফাইল খণ্ডের ডিফল্ট আকার) এর পরিবর্তে 1024bytes (কেবি) এ ফলাফল পেতে ডু-র অনুরোধে কেবল-কে যুক্ত করুন।
অলিভিয়ার ডুলাক

2
du -sআপ যোগ হবে ডিস্কের ব্যবহার সব ফাইল এর (না সাইজ) ও ডিরেক্টরিগুলি এবং অন্যান্য অ নিয়মিত ফাইল , একই ফাইলে অতিরিক্ত হার্ড সংযোগগুলি ব্যতীত যখন findসব নিয়মিত ফাইল গণনা করা হবে। এছাড়াও, নতুন লাইনের অক্ষরযুক্ত ফাইলের নামগুলি কয়েকবার গণনা করা হবে। du -Sজিএনইউ নির্দিষ্ট। du -sওএসের উপর নির্ভর করে সেক্টর বা কিলোবাইট প্রতিবেদন করবে।
স্টাফেন চেজেলাস

যথারীতি @ স্টেফেন শেজেলাস আপনার লিনাক্স / ইউনিক্স সম্পর্কে আপনার জ্ঞান আমাকে অবাক করে এবং দেখায় যে আমার দ্রুত এবং নোংরা সমাধানগুলি কতটা নোংরা। আপনি কতক্ষণ ধরে লিনাক্স / ইউনিক্স ব্যবহার করছেন?
ড্রার ক্লারিস

উত্তর মারাত্মকভাবে ভুল এবং মুছে ফেলা উচিত। স্টিফেন ব্যাখ্যা করেছেন।
একিউম্যানাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.