कैसे पता चलेगा कि एक असंपीड़ित ज़िप कितनी जगह लेगी


23

ज़िप फ़ाइलों की एक (वास्तव में लंबी) सूची को देखते हुए, आप एक बार असम्पीडित होने का आकार कैसे बता सकते हैं?

जवाबों:


38

आप unzip -Zt zipnameकुल आकार के साथ, संग्रह सामग्री के बारे में सीधे सारांश प्रिंट करते हुए ऐसा कर सकते हैं । यहाँ इसके उत्पादन पर एक उदाहरण है:

unzip -Zt a.zip
1 file, 14956 bytes uncompressed, 3524 bytes compressed:  76.4%

फिर, awk का उपयोग करके, आप बाइट्स की संख्या निकाल सकते हैं:

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प्रत्येक फ़ाइल के आकार को सूचीबद्ध करता है और उनकी राशि के साथ एक अंतिम पंक्ति प्रिंट करता है। तो आप ज़िप फ़ाइलों के माध्यम से लूप कर सकते हैं और के उत्पादन को जोड़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 अधिकांश सिस्टम पर डिफ़ॉल्ट रूप से) भरती है। निम्न स्क्रिप्ट प्रत्येक फ़ाइल को 4kB तक गोल करके और फ़ाइल नाम के साथ साथ कुछ बाइट्स की लंबाई जोड़कर कुल आकार का अनुमान लगाती है।

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 छोटी फ़ाइलों और इस तथ्य का उल्लेख करने के लिए कि फाइल सिस्टम छोटी फाइलों को एक साथ पैक नहीं करता है जिस तरह से ज़िप करता है। AFAIK, जीत / OSX / Linux / BSD पर कोई मेनस्ट्रीम फाइलसिस्टम नहीं है (अर्थात जिन्हें आप सुझा सकते हैं कि कोई व्यक्ति अपने डेस्कटॉप या सर्वर पर / और / घर के लिए उपयोग करता है) एक विकल्प के रूप में छोटी फ़ाइल पैकिंग है। Reiserfs के पास ऐसा करने का एक विकल्प था (और बड़ी फ़ाइलों की पूंछ), लेकिन यह अस्वीकार्य है। मैंने बड़े पैमाने पर लंबे फ़ाइल नामों के बारे में नहीं सोचा था , हालाँकि। अच्छी पकड़।
पीटर कॉर्ड्स

आप निरंतर 256B या 512B प्रति फ़ाइल में भी जोड़ सकते हैं, क्योंकि यह एक इनोड (XFS पर) का आकार है। मुझे लगता है कि ext4 अभी भी वैधानिक रूप से इनोड्स को आवंटित करता है, हालांकि, इनोड्स के लिए उपयोग नहीं किया जाने वाला स्थान वैसे भी अन्य डेटा को पकड़ नहीं सकता है। (यही कारण है कि एक्सएफ 4 में df -iएक्सएफएस की तुलना में एक्स 4 के पास इतनी कम संख्या है ( जो कि जरूरत के अनुसार डायोड में उतनी ही जगह आवंटित कर सकता है।)
पीटर कॉर्ड्स

1

देखो मा, नहीं छोरों!

यहां एक और समाधान है, जो थोड़ा तेज हो सकता है, क्योंकि यह छोरों का उपयोग नहीं करता है, लेकिन फिर भी एक ही उत्तर में आता है।

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

"BEGIN {कुल = 0}" भाग की कड़ाई से आवश्यकता नहीं है।

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