Припустимо, у мене є 10 000 XML-файлів. Тепер припустимо, що я хочу надіслати їх другові. Перш ніж надсилати їх, я хотів би їх стиснути.
Спосіб 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: Створіть єдиний поштовий індекс, що містить 10 000 файлів xml
Команда:
zip all.zip $(ls -1)
Результати:
Resulting Size: 12 MB
Percent of initial size: 19%
Спосіб 4: Об’єднайте файли в один файл і зафіксуйте його
Команда:
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)
Редагувати: метадані
Одна відповідь говорить про те, що різниця полягає в системних метаданих, які зберігаються в zip. Я не думаю, що це може бути так. Для тестування я зробив наступне:
for x in $(seq 10000) ; do touch $x ; done
zip allZip $(ls -1)
Отриманий поштовий індекс становить 1,4 Мб. Це означає, що залишається ~ 10 Мб незрозумілого простору.
$(ls -1)
просто використовувати *
: for x in *
; zip all.zip *
.tar.gz
а не просто застібати весь каталог.