ज़िप फ़ाइलों की एक (वास्तव में लंबी) सूची को देखते हुए, आप एक बार असम्पीडित होने का आकार कैसे बता सकते हैं?
ज़िप फ़ाइलों की एक (वास्तव में लंबी) सूची को देखते हुए, आप एक बार असम्पीडित होने का आकार कैसे बता सकते हैं?
जवाबों:
आप 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
यदि आप टाइप करते हैं 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
प्रत्येक फ़ाइल के आकार को सूचीबद्ध करता है और उनकी राशि के साथ एक अंतिम पंक्ति प्रिंट करता है। तो आप ज़िप फ़ाइलों के माध्यम से लूप कर सकते हैं और के उत्पादन को जोड़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}
'
df -i
एक्सएफएस की तुलना में एक्स 4 के पास इतनी कम संख्या है ( जो कि जरूरत के अनुसार डायोड में उतनी ही जगह आवंटित कर सकता है।)
देखो मा, नहीं छोरों!
यहां एक और समाधान है, जो थोड़ा तेज हो सकता है, क्योंकि यह छोरों का उपयोग नहीं करता है, लेकिन फिर भी एक ही उत्तर में आता है।
unzip -l \*.zip|awk 'BEGIN{total=0}/ [0-9]+ files/{total=total+$1;}END{print "total bytes: "total}'
"BEGIN {कुल = 0}" भाग की कड़ाई से आवश्यकता नहीं है।