Làm thế nào để biết một zip không nén sẽ mất bao nhiêu


23

Đưa ra một danh sách (thực sự dài) các tệp zip, làm thế nào bạn có thể cho biết kích thước của chúng một khi không nén?

Câu trả lời:


38

Bạn có thể làm điều đó bằng cách sử dụng unzip -Zt zipnamebản in tóm tắt trực tiếp về nội dung lưu trữ, với tổng kích thước. Đây là một ví dụ về đầu ra của nó:

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

Sau đó, bằng cách sử dụng awk, bạn có thể trích xuất số byte:

unzip -Zt a.zip | awk '{print $3}'
14956

Cuối cùng, đặt nó trong một vòng lặp for như trong câu trả lời của Tom:

total=0
for file in *.zip; do # or whichever files you want
    (( total += $(unzip -Zt $file |awk '{ print $3 }') ))
done
echo $total

19

Nếu bạn nhập unzip -l <zipfile>, nó sẽ in một danh sách các tệp trong zip, với kích thước không nén của chúng, sau đó tổng kích thước không nén của tất cả chúng.

Đây là đầu ra có thể đọc được của con người, nhưng bạn có thể lấy số máy có thể đọc được bằng cách sử dụng unzip -l <zipfile> | tail -n1 | awk '{ print $1 }'.

Để có được tổng kích thước:

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 -lliệt kê kích thước của mỗi tệp và in một dòng cuối cùng với tổng của chúng. Vì vậy, bạn có thể lặp qua các tệp zip và thêm đầu ra củaunzip -l "$zip" | awk 'END {print $1}' hoặc unzip -Zt "$zip" | awk 'END {print $3}'. Đối với vòng lặp shell, unzip -Ztcó thể nhanh hơn một chút:

total=0
for z in *.zip; do
  set $(unzip -Zt -- "$z")
  total=$((total + $3))
done

Điều đó chỉ cho bạn biết tổng kích thước của các tập tin. Mỗi tệp có một chi phí nhỏ: không gian để lưu trữ tên của nó, không gian để lưu trữ một số siêu dữ liệu của nó và có thể là một chút không gian chưa sử dụng vì hầu hết các hệ thống tệp phân bổ các tệp theo khối. Trên các hệ thống tập tin điển hình, tổng phí có thể lên tới vài kilobyte. Không thể dự đoán chính xác vì chi phí phụ thuộc vào kích thước tệp, vào cấu trúc thư mục (vì chi phí chung của thư mục) và khả năng của hệ thống tệp để hợp nhất nhiều tệp nhỏ trong cùng một khối.

Nếu hầu hết các tệp nhiều hơn một vài kilobyte, đừng lo lắng về điều này. Nhưng nếu các tệp rất nhỏ, bạn có thể muốn tính đến chi phí. Một lần nữa, chi phí phụ thuộc vào hệ thống tập tin. Trên ext4, mỗi tệp điền vào một khối đầy đủ (4kB theo mặc định trên hầu hết các hệ thống). Tập lệnh sau xấp xỉ tổng kích thước bằng cách làm tròn mỗi tệp lên đến 4kB và thêm độ dài của tên tệp cộng với một vài byte.

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 để đề cập đến các tệp nhỏ và thực tế là các hệ thống tệp không đóng gói các tệp nhỏ lại với nhau theo cách mà một zip thực hiện. AFAIK, không có hệ thống tệp chính nào trên win / OSX / Linux / BSD (tức là những hệ thống bạn có thể khuyên ai đó sử dụng cho / và / home trên máy tính để bàn hoặc máy chủ của họ) có tùy chọn đóng gói tệp nhỏ. Reiserfs có một tùy chọn để làm điều này (và đuôi của các tệp lớn hơn), nhưng nó không được làm rõ. Tôi đã không nghĩ về tên tập tin dài , mặc dù. Nắm bắt tốt.
Peter Cordes

Bạn cũng có thể thêm vào 256B hoặc 512B không đổi trên mỗi tệp, vì đó là kích thước của một nút (trên XFS). Tuy nhiên, tôi nghĩ rằng ext4 vẫn phân bổ tĩnh các nút, do đó, không gian không được sử dụng cho các nút không thể giữ dữ liệu khác. (Đây là lý do tại sao ext4 có số lượng inode miễn phí thấp như vậy ( df -i), so với XFS có thể tự động phân bổ nhiều không gian cho các nút mà nó cần.)
Peter Cordes

1

Nhìn ma, không có vòng lặp!

Đây là một giải pháp khác, có thể nhanh hơn một chút, vì nó không sử dụng các vòng lặp, nhưng vẫn đi đến cùng một câu trả lời.

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

Phần "BEGIN {Total = 0}" không bắt buộc.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.