Как получить максимальное сжатие с .tar.gz? [Дубликат]

63

На этот вопрос уже есть ответ здесь:

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

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

Поскольку я не до конца понимаю, как работает сжатие @ это ядро, у меня есть (возможно, нелепые) опасения, что отправка предварительно сжатого .tar в gzip может помешать сжатию gzip, а также его возможному разрешению и тому подобному.

По сути, мой вопрос: какую комбинацию методов args / сжатие я должен использовать для создания абсолютного наименьшего tar.gz, и как для этого выглядит выражение командной строки?

Марио Зильотто
источник
2
Сжатие уже сжатых файлов может уменьшить их размер или увеличить размер архива. Все зависит от типа данных и используемого сжатия.
Келтари
Что сказал @Keltari. Степени сжатия и коэффициенты сильно зависят от того, что именно вы сжимаете, поэтому также существуют разные алгоритмы и методы сжатия.
music2myear

Ответы:

111

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

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

Кроме того, чтобы ваши envvars были свободными от помех, вы можете сделать это:

env GZIP=-9 tar cvzf file.tar.gz /path/to/directory
Брайан Фейн
источник
43

Как вы сказали, « tar может также сжимать », это означает, что - tarне всегда сжимает данные сам по себе.

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

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

tar cvf - / путь / к / каталогу | gzip -9 -> file.tar.gz

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

Уджвал Сингх
источник
У меня была проблема, когда он не рекурсивный, и жалуется, что это будет пустой архив, так как команда разбита, трудно найти, как правильно вызвать рекурсив, так как его уже tar по умолчанию. МОЙ ПЛОХОЙ, я неправильно определил это, начиная с этогоtar -cvf /path
Брайан Томас
17

Обычно ни gzip, ни tar не могут создать «самый маленький tar.gz». Есть много утилит сжатия, которые могут сжимать до формата gz. Я написал Баш скрипт « gz99 » , чтобы попробовать gzip, 7zи , advdefчтобы получить файл наименьшего. Чтобы использовать это для создания наименьшего возможного запуска файла:

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

advdefУтилита от AdvanceCOMP обычно дает наименьший размер, но и глючит (то gz99утилита проверяет , что он не поврежден файл , прежде чем принять выход advdef). Для advdefнепосредственного использования создайте файл .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

Чтобы быстро понять, как сравниваются эти утилиты сжатия, рассмотрим эффект сжатия patch-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 без сжатия, которое занимает слишком много времени.

gmatht
источник
ОП спросил, как получить наибольшее сжатие для файла .tar.gz, но вы предложили создать файл .tar.xz. Вы отвечаете на вопрос, отличный от заданного.
ChrisInEdmonton
Ах, я вижу, что вы собираетесь. advdef просто падает в моей системе (v1.15), поэтому 'advdef -z -4 file.tar.gz' не работает, но, по крайней мере, теоретически может. Я не могу найти доказательств того, что это уменьшит файл дальше, чем «gzip -9», но это может быть, и в любом случае мне достаточно, чтобы убрать свой голос -1. Спасибо за разъяснение!
ChrisInEdmonton
Хм, я использую v1.17. Во всяком случае, педантичный математик во мне хочет указать, что мой ответ, возможно, технически неверен. В конце концов, если вы перечислите все возможные файлы gz от самого короткого до самого длинного и выберете первый файл, который распаковывается в нужный файл, вы можете сократить еще несколько байтов. Но это было бы слишком медленно на практике.
Gmatht
Я не думаю, что "багги" и "архив" должны когда-либо использоваться вместе, зачем использовать поврежденный архив? Вам нужен гораздо больший файл, чтобы «сравнивать» утилиты сжатия, а также разные типы входных файлов - измерение с точностью до сотых долей секунды не так уж надежно, я думаю, что xz -9обычно требуется примерно 5-кратное gz -9время, а не только 1,5- кратное ваш стол подсказывает.
Xen2050
как мы можем создать разделенные архивы (при сжатии), используя процесс xz, пожалуйста
nyxee
6
tar c /path/to/data | gzip --best > file.tar.gz

gzipПараметр --best(эквивалентный -9) запрашивает самый высокий уровень сжатия.

Карлито
источник
4
Или используйте --bestфлаг: -9 сбивает читателя с толку.
om-nom-nom