เมื่อได้รับรายการไฟล์ zip (ยาวมาก) คุณจะบอกขนาดไฟล์ได้อย่างไรเมื่อไม่มีการบีบอัด
เมื่อได้รับรายการไฟล์ zip (ยาวมาก) คุณจะบอกขนาดไฟล์ได้อย่างไรเมื่อไม่มีการบีบอัด
คำตอบ:
คุณสามารถทำได้โดยใช้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>
มันจะพิมพ์รายการไฟล์ภายใน 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
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
) เมื่อเทียบกับ XFS ซึ่งสามารถจัดสรรพื้นที่ให้กับ inodes ได้ตามที่ต้องการ)
ดูสิไม่มีลูป!
นี่เป็นอีกวิธีการหนึ่งที่อาจเร็วกว่าเล็กน้อยเพราะมันไม่ได้ใช้ลูป แต่ก็มาถึงคำตอบเดียวกัน
unzip -l \*.zip|awk 'BEGIN{total=0}/ [0-9]+ files/{total=total+$1;}END{print "total bytes: "total}'
ไม่จำเป็นต้องใช้ส่วน "BEGIN {total = 0}"