สมมติว่าฉันมีไฟล์ XML 10,000 ไฟล์ ตอนนี้สมมติว่าฉันต้องการส่งพวกเขาไปให้เพื่อน ก่อนที่จะส่งพวกเขาฉันต้องการที่จะบีบอัดพวกเขา
วิธีที่ 1: อย่าบีบอัด
ผล:
Resulting Size: 62 MB
Percent of initial size: 100%
วิธีที่ 2: บีบอัดไฟล์ทุกไฟล์แล้วส่ง 10,000 ไฟล์ xml ให้เขา
คำสั่ง:
for x in $(ls -1) ; do echo $x ; zip "$x.zip" $x ; done
ผล:
Resulting Size: 13 MB
Percent of initial size: 20%
วิธีที่ 3: สร้างไฟล์ zip เดียวที่มีไฟล์ 10,000 xml
คำสั่ง:
zip all.zip $(ls -1)
ผล:
Resulting Size: 12 MB
Percent of initial size: 19%
วิธีที่ 4: เชื่อมไฟล์เข้าด้วยกันเป็นไฟล์เดียว & zip
คำสั่ง:
cat *.xml > oneFile.txt ; zip oneFile.zip oneFile.txt
ผล:
Resulting Size: 2 MB
Percent of initial size: 3%
คำถาม:
- ทำไมฉันถึงได้ผลลัพธ์ที่ดีขึ้นอย่างมากเมื่อฉันเพิ่งซิปไฟล์เดียว?
- ฉันคาดหวังว่าจะได้รับผลลัพธ์ที่ดีขึ้นอย่างมากโดยใช้วิธีที่ 3 กว่าวิธีที่ 2 แต่ไม่ใช่ ทำไม?
- พฤติกรรมนี้มีลักษณะเฉพาะ
zip
หรือไม่? ถ้าฉันลองใช้gzip
ฉันจะได้ผลลัพธ์ที่แตกต่างกันไหม
ข้อมูลเพิ่มเติม:
$ 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)
แก้ไข: ข้อมูล Meta
คำตอบหนึ่งชี้ให้เห็นว่าความแตกต่างคือข้อมูลเมตาของระบบที่เก็บไว้ในรหัสไปรษณีย์ ฉันไม่คิดว่าจะเป็นเช่นนั้น ในการทดสอบฉันทำสิ่งต่อไปนี้:
for x in $(seq 10000) ; do touch $x ; done
zip allZip $(ls -1)
ซิปที่ได้คือ 1.4MB ซึ่งหมายความว่ายังคงมีพื้นที่ที่ไม่ได้อธิบายประมาณ 10 MB
$(ls -1)
ใช้เพียง*
: for x in *
; zip all.zip *
.tar.gz
แทนที่จะทำแค่ซิปไดเร็กตอรี่ทั้งหมด