জিপ ফাইলগুলির একটি (সত্যই দীর্ঘ) তালিকা দেওয়া, আপনি কীভাবে একবার সঙ্কুচিত হয়ে তার আকার বলতে পারবেন?
জিপ ফাইলগুলির একটি (সত্যই দীর্ঘ) তালিকা দেওয়া, আপনি কীভাবে একবার সঙ্কুচিত হয়ে তার আকার বলতে পারবেন?
উত্তর:
আপনি এটি করতে পারেন unzip -Zt zipname
যা মোট আকার সহ আর্কাইভ সামগ্রী সম্পর্কে সরাসরি কোনও সংক্ষিপ্তসার মুদ্রণ করে । এটির ফলাফল সম্পর্কে এখানে একটি উদাহরণ দেওয়া হল:
unzip -Zt a.zip
1 file, 14956 bytes uncompressed, 3524 bytes compressed: 76.4%
তারপরে, খালি ব্যবহার করে, আপনি বাইটের সংখ্যা বের করতে পারেন:
unzip -Zt a.zip | awk '{print $3}'
14956
অবশেষে, টমের উত্তরের মতো এটি লুপের জন্য রাখুন:
total=0
for file in *.zip; do # or whichever files you want
(( total += $(unzip -Zt $file |awk '{ print $3 }') ))
done
echo $total
আপনি যদি টাইপ করেন তবে unzip -l <zipfile>
এটি জিপের মধ্যে ফাইলগুলির একটি তালিকা মুদ্রণ করে তাদের সঙ্কুচিত আকারের সাথে, তারপরে সেগুলির মোট মোট সঙ্কুচিত আকার।
এটি মানব-পঠনযোগ্য আউটপুট, তবে আপনি ব্যবহার করে একটি মেশিন-পঠনযোগ্য নম্বর পেতে পারেন unzip -l <zipfile> | tail -n1 | awk '{ print $1 }'
।
মোট আকার পেতে:
total=0
for file in *.zip; do # or whichever files you want
(( total += $(unzip -l $file | tail -n1 | awk '{ print $1 }') ))
done
echo $total
unzip -l
প্রতিটি ফাইলের আকার তালিকাভুক্ত করে এবং তাদের যোগফলের সাথে একটি চূড়ান্ত লাইন প্রিন্ট করে। তাই আপনি যা করতে পারেন লুপ zip ফাইলে দিয়ে আউটপুট পর্যন্ত যোগunzip -l "$zip" | awk 'END {print $1}'
অথবা unzip -Zt "$zip" | awk 'END {print $3}'
। শেল লুপের জন্য, unzip -Zt
কিছুটা দ্রুত হতে পারে:
total=0
for z in *.zip; do
set $(unzip -Zt -- "$z")
total=$((total + $3))
done
এটি কেবলমাত্র ফাইলগুলির মোট আকার বলে। প্রতিটি ফাইলের একটি ছোট ওভারহেড থাকে: এর নাম সংরক্ষণ করার স্থান, এর কিছু মেটাডেটা সঞ্চয় করার স্থান এবং সম্ভবত কিছুটা অব্যবহৃত স্থান কারণ বেশিরভাগ ফাইল সিস্টেমগুলি ব্লকে ফাইল বরাদ্দ করে। টিপিক্যাল ফাইল সিস্টেমে ওভারহেড কয়েক কিলোবাইট পর্যন্ত হতে পারে। এটি ঠিক অনুমানযোগ্য নয় কারণ ওভারহেড ফাইলের আকারের উপর নির্ভর করে ডিরেক্টরি কাঠামোর উপর (ডিরেক্টরি ওভারহেডের কারণে), এবং একই সিস্টেমে একাধিক ছোট ফাইল একত্রীকরণের ফাইল সিস্টেমের সক্ষমতার উপর।
বেশিরভাগ ফাইলগুলি যদি কয়েক কিলোবাইটের বেশি হয় তবে এটি নিয়ে চিন্তা করবেন না। তবে ফাইলগুলি খুব ছোট হলে আপনি ওভারহেডটিকে অ্যাকাউন্টে নিতে চাইতে পারেন। আবার, ওভারহেড ফাইল সিস্টেমের উপর নির্ভর করে। Ext4-এ, প্রতিটি ফাইল একটি সম্পূর্ণ ব্লক পূরণ করে (বেশিরভাগ সিস্টেমে ডিফল্টরূপে 4KB)। নিম্নলিখিত ফাইলটি প্রতিটি ফাইলকে 4 কেবি অবধি গোল করে এবং ফাইলের নামের দৈর্ঘ্য এবং কয়েক বাইট যোগ করে মোট আকারের সমান করে x
for z in *.zip; do
unzip -l -- "$z"
done | awk '
$2 ~ /^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$/ {total += ($1+4095)/4096*4096 + length($0)}
END {print total}
'
df -i
তুলনায় এক্সট 4 এর এত কম সংখ্যক ফ্রি ইনোড রয়েছে )) যা প্রয়োজন অনুযায়ী আয়নোডগুলিতে গতিশীলভাবে যত বেশি জায়গা বরাদ্দ করতে পারে))
দেখ মা, না লুপ!
এখানে আরও একটি সমাধান রয়েছে, এটি কিছুটা দ্রুত হতে পারে, কারণ এটি লুপ ব্যবহার করে না, তবে এখনও একই উত্তরে উপস্থিত হয়।
unzip -l \*.zip|awk 'BEGIN{total=0}/ [0-9]+ files/{total=total+$1;}END{print "total bytes: "total}'
"BEGIN {মোট = 0}" অংশটি কঠোরভাবে প্রয়োজন হয় না।