จะทราบได้อย่างไรว่าต้องใช้พื้นที่ในการบีบอัดรหัสไปรษณีย์ที่ไม่บีบอัด


23

เมื่อได้รับรายการไฟล์ zip (ยาวมาก) คุณจะบอกขนาดไฟล์ได้อย่างไรเมื่อไม่มีการบีบอัด

คำตอบ:


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>มันจะพิมพ์รายการไฟล์ภายใน zip ด้วยขนาดที่ไม่บีบอัดแล้วขนาดที่ไม่บีบอัดรวมของไฟล์ทั้งหมด

นี่คือผลลัพธ์มนุษย์สามารถอ่านได้ 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 สำหรับการกล่าวถึงไฟล์ขนาดเล็กและความจริงที่ว่าระบบไฟล์ไม่ได้รวมไฟล์ขนาดเล็กเข้าด้วยกันอย่างที่ zip ทำ AFAIK ไม่มีระบบไฟล์หลักบน win / OSX / Linux / BSD (เช่นคนที่คุณสามารถแนะนำให้ใครบางคนใช้สำหรับ / และ / home บนเดสก์ท็อปหรือเซิร์ฟเวอร์) มีการบรรจุไฟล์ขนาดเล็กเป็นตัวเลือก Reiserfs มีตัวเลือกในการทำเช่นนี้ (และส่วนท้ายของไฟล์ที่มีขนาดใหญ่กว่า) แต่ไม่มีการเปลี่ยนแปลง ฉันไม่ได้คิดถึงชื่อไฟล์ที่ยาวมาก ๆ จับดี.
Peter Cordes

คุณอาจเพิ่ม 256B หรือ 512B คงที่ต่อไฟล์ตามขนาดของ inode (บน XFS) ฉันคิดว่า ext4 ยังคงจัดสรร inodes แบบคงที่ดังนั้นพื้นที่ที่ไม่ได้ใช้สำหรับ inodes ก็ไม่สามารถเก็บข้อมูลอื่นได้ (นี่คือเหตุผลที่ ext4 มีจำนวน inode อิสระที่ต่ำ ( df -i) เมื่อเทียบกับ XFS ซึ่งสามารถจัดสรรพื้นที่ให้กับ inodes ได้ตามที่ต้องการ)
Peter Cordes

1

ดูสิไม่มีลูป!

นี่เป็นอีกวิธีการหนึ่งที่อาจเร็วกว่าเล็กน้อยเพราะมันไม่ได้ใช้ลูป แต่ก็มาถึงคำตอบเดียวกัน

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

ไม่จำเป็นต้องใช้ส่วน "BEGIN {total = 0}"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.