2012-12-01 20:47:48 +0000 2012-12-01 20:47:48 +0000
67
67

Как получить максимальное сжатие с помощью .tar.gz?

Способ, которым я понимаю использование tar + gzip, заключается в том, что tar обычно используется для объединения группы файлов в один файл, затем gzip используется для сжатия этого файла.

недавно я узнал, что tar также может сжимать.

Поскольку я не полностью понимаю, как работает сжатие @ это ядро, у меня есть (возможно, нелепая) озабоченность тем, что отправка предварительно сжатого .tar в gzip может помешать gzip сжимать так же хорошо, как это мог бы позволить и вещи подобного рода. 0x2 и 0x2 и мой вопрос по существу: Какую комбинацию методов args/compression я должен использовать для создания самого маленького tar.gz, и как для этого выглядит оператор командной строки?

Ответы (4)

118
118
118
2013-01-31 18:55:22 +0000

Или вы можете сказать tar пользователю максимальное сжатие таким образом:

export GZIP=-9
tar cvzf file.tar.gz /path/to/directory

Дополнительно, чтобы ваши завистники не беспокоились, вы можете сделать это:

env GZIP=-9 tar cvzf file.tar.gz /path/to/directory
44
44
44
2012-12-02 03:37:18 +0000

Как вы сказали - “tar can also compress”, подразумевает, что - tar не сжимает данные always самостоятельно.

Он делает это только при использовании опции z. Это тоже не само по себе, а - передавая запятнанные данные через gzip.

Однако вместо этого, как отмечено в ответе это , вы можете передать две команды: tar и gzip таким образом, что вы можете явно указать уровень сжатия для команды gzip, чтобы получить наименьший выходной размер.

tar cvf - /path/to/directory | gzip -9 - > file.tar.gz

Здесь 9 указывает максимально возможный уровень сжатия.

17
17
17
2014-03-10 15:23:08 +0000

Обычно ни gzip, ни tar не могут создать “абсолютный наименьший tar.gz”. Существует множество утилит сжатия, которые могут сжиматься до формата gz. Я написал скрипт bash gz99 “, чтобы попробовать gzip, 7z и advdef, чтобы получить самый маленький файл. Чтобы использовать его для создания самого маленького файла:

tar c path/to/data | gz99 file.gz

Утилита advdef из AdvanceCOMP обычно дает самый маленький файл, но также имеет ошибку (утилита gz99 проверяет, что файл не был поврежден, прежде чем принять вывод advdef). Чтобы использовать advdef напрямую, создайте файл file.tar.gz, как вам удобно. Затем запустите:

advdef -z -4 file.tar.gz

Это создаст стандартный gz файл, который можно прочитать с помощью gzip и tar, как обычно, чуть-чуть меньше. Это лучшее, что вы можете сделать с форматом gz.

Поскольку вы только недавно узнали, что tar может сжимать, и не сказали, зачем вам нужен самый маленький файл ”.tar.gz", вы можете не знать, что существуют более эффективные форматы, которые можно использовать с tar-файлами, такими как xz. Обычно, переход на другой формат может дать значительно лучшее улучшение в сжатии, чем проигрывание с помощью опций gzip. Основным недостатком xz является то, что он не так распространен, как gzip, поэтому людям, которым вы отправляете файл, возможно, придется установить новый пакет. Он также имеет тенденцию быть немного медленнее, особенно при сжатии. Если для вас это не имеет значения, и вам действительно нужен самый маленький tar-файл, попробуйте:

tar cv path/to/data | xz -9 > file.tar.xz

Современные версии tar, например, на Ubuntu 13.10, автоматически обнаруживают сжатые файлы. Так что даже если вы используете сжатие xz, вы всё равно сможете распаковывать как обычно:

tar xvf file.tar.xz

Чтобы дать быстрое представление о том, как эти утилиты сжатия сравниваются, рассмотрите эффект сжатия патча-3.1.1 из ядра linux:

utility cpu format size(bytes)
gzip -9 0.02s gz 105,628
advdef -2 0.07s gz 102,619
7z -mx=9 -tgzip 0.42s gz 102,297
advdef -3 0.55s gz 102,290
advdef -4 0.75s gz 101,956
xz -9 0.03s xz 91,064
xz -3e 0.15s xz 90,996

В этом тривиальном примере мы видим, что для получения самого маленького gz нам нужен advdef (хотя 7z -tgzip почти так же хорош и намного меньше багги). Мы также видим, что переход на xz дает нам гораздо больше пространства, чем попытки выжать максимум из старого формата gz, без компрессии, занимающей слишком много времени.

6
6
6
2014-02-06 18:25:54 +0000

Опция tar c /path/to/data | gzip --best > file.tar.gz

gzip (эквивалент --best) требует самого высокого уровня сжатия.