একটি সঙ্কুচিত জিপ কতটা জায়গা নেবে তা কীভাবে জানবেন


23

জিপ ফাইলগুলির একটি (সত্যই দীর্ঘ) তালিকা দেওয়া, আপনি কীভাবে একবার সঙ্কুচিত হয়ে তার আকার বলতে পারবেন?

উত্তর:


38

আপনি এটি করতে পারেন 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

19

আপনি যদি টাইপ করেন তবে 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

15

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}
'

ছোট ফাইলগুলি উল্লেখ করার জন্য +1 এবং যে ফাইল ফাইলগুলি একটি জিপের মতো ছোট ফাইল একসাথে প্যাক করে না। আফাইক, উইন / ওএসএক্স / লিনাক্স / বিএসডি-তে কোনও মূলধারার ফাইল সিস্টেম নেই (যেমন আপনি সুপারিশ করতে পারেন যে কেউ তাদের ডেস্কটপ বা সার্ভারে / এবং / হোম ব্যবহার করেন) বিকল্প হিসাবে ছোট ফাইল প্যাকিং রয়েছে have রিসফারফদের কাছে এটি করার বিকল্প ছিল (এবং বড় ফাইলগুলির লেজ), তবে এটি অবিস্মরণীয়। যদিও আমি দীর্ঘমেয়াদে ফাইলের নাম চিন্তা করিনি । ভালো বল ধরা.
পিটার কর্ডেস

আপনি প্রতি ফাইল প্রতি ধ্রুবক 256B বা 512B যুক্ত করতে পারেন, কারণ এটি কোনও ইনোডের আকার (এক্সএফএসে)। আমি মনে করি ext4 এখনও স্থিরভাবে ইনোডগুলি বরাদ্দ করে, যদিও, তাই আইওনডগুলির জন্য ব্যবহৃত স্থানটি অন্য কোনও উপায়ে ধরে রাখতে পারে না। (এ কারণেই এক্সএফএসের df -iতুলনায় এক্সট 4 এর এত কম সংখ্যক ফ্রি ইনোড রয়েছে )) যা প্রয়োজন অনুযায়ী আয়নোডগুলিতে গতিশীলভাবে যত বেশি জায়গা বরাদ্দ করতে পারে))
পিটার কর্ডেস

1

দেখ মা, না লুপ!

এখানে আরও একটি সমাধান রয়েছে, এটি কিছুটা দ্রুত হতে পারে, কারণ এটি লুপ ব্যবহার করে না, তবে এখনও একই উত্তরে উপস্থিত হয়।

unzip -l \*.zip|awk 'BEGIN{total=0}/        [0-9]+ files/{total=total+$1;}END{print "total bytes: "total}'

"BEGIN {মোট = 0}" অংশটি কঠোরভাবে প্রয়োজন হয় না।

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