Giả sử rằng tôi có 10.000 tệp XML. Bây giờ giả sử rằng tôi muốn gửi chúng cho một người bạn. Trước khi gửi chúng, tôi muốn nén chúng.
Phương pháp 1: Đừng nén chúng
Các kết quả:
Resulting Size: 62 MB
Percent of initial size: 100%
Phương pháp 2: Zip mọi tệp và gửi cho anh ta 10.000 tệp xml
Chỉ huy:
for x in $(ls -1) ; do echo $x ; zip "$x.zip" $x ; done
Các kết quả:
Resulting Size: 13 MB
Percent of initial size: 20%
Phương pháp 3: Tạo một zip duy nhất chứa 10.000 tệp xml
Chỉ huy:
zip all.zip $(ls -1)
Các kết quả:
Resulting Size: 12 MB
Percent of initial size: 19%
Phương pháp 4: Ghép các tệp thành một tệp duy nhất & nén tệp
Chỉ huy:
cat *.xml > oneFile.txt ; zip oneFile.zip oneFile.txt
Các kết quả:
Resulting Size: 2 MB
Percent of initial size: 3%
Câu hỏi:
- Tại sao tôi nhận được kết quả tốt hơn đáng kể như vậy khi tôi chỉ nén một tệp duy nhất?
- Tôi đã mong đợi để có được kết quả tốt hơn nhiều khi sử dụng phương pháp 3 so với phương pháp 2, nhưng không. Tại sao?
- Là hành vi này cụ thể
zip
? Nếu tôi thử sử dụnggzip
tôi sẽ nhận được kết quả khác nhau?
Thông tin bổ sung:
$ zip --version
Copyright (c) 1990-2008 Info-ZIP - Type 'zip "-L"' for software license.
This is Zip 3.0 (July 5th 2008), by Info-ZIP.
Currently maintained by E. Gordon. Please send bug reports to
the authors using the web page at www.info-zip.org; see README for details.
Latest sources and executables are at ftp://ftp.info-zip.org/pub/infozip,
as of above date; see http://www.info-zip.org/ for other sites.
Compiled with gcc 4.4.4 20100525 (Red Hat 4.4.4-5) for Unix (Linux ELF) on Nov 11 2010.
Zip special compilation options:
USE_EF_UT_TIME (store Universal Time)
SYMLINK_SUPPORT (symbolic links supported)
LARGE_FILE_SUPPORT (can read and write large files on file system)
ZIP64_SUPPORT (use Zip64 to store large files in archives)
UNICODE_SUPPORT (store and read UTF-8 Unicode paths)
STORE_UNIX_UIDs_GIDs (store UID/GID sizes/values using new extra field)
UIDGID_NOT_16BIT (old Unix 16-bit UID/GID extra field not used)
[encryption, version 2.91 of 05 Jan 2007] (modified for Zip 3)
Chỉnh sửa: Dữ liệu meta
Một câu trả lời cho thấy sự khác biệt là dữ liệu meta hệ thống được lưu trữ trong zip. Tôi không nghĩ rằng đây có thể là trường hợp. Để kiểm tra, tôi đã làm như sau:
for x in $(seq 10000) ; do touch $x ; done
zip allZip $(ls -1)
Zip kết quả là 1,4 MB. Điều này có nghĩa là vẫn còn ~ 10 MB không gian không giải thích được.
$(ls -1)
, chỉ sử dụng *
: for x in *
; zip all.zip *
.tar.gz
trái ngược với việc chỉ nén toàn bộ thư mục.