Đư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?
Đư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:
Bạn có thể làm điều đó bằng cách sử dụng unzip -Zt zipname
bả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
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
unzip -l
liệ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 -Zt
có 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}
'
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.)
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.