Вопрос: Как указать уровень сжатия при использовании tar -zcvf?


Я gzip каталоги очень часто на работе. То, что я обычно делаю, это

tar -zcvf file.tar.gz /path/to/directory

Есть ли способ указать уровень сжатия здесь? Я хочу использовать наилучшее сжатие, даже если для сжатия требуется больше времени.


121
2017-07-01 18:00


Источник




Ответы:


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

предполагая, что вы используете bash. Как правило, установите переменную среды GZIP в «-9» и обычным образом запускайте tar.

Также - если вы действительно хотите лучшего сжатия, не используйте gzip. Используйте lzma или 7z.

И при использовании gzip (что в любом случае полезно по разным причинам) рассмотрите возможность использования pigz программы, а не gzip,


115
2017-07-01 18:38



свиньи быстрее. Это все. Я не вижу большого смысла в том, что сжатие занимает больше времени, а конечный результат практически не меняется.
Является -9 по назначению или опечатку? - Jürgen Paul
Нарочно. Это конкретный ответ на вопрос ОП.
pigz - это «параллельный gzip», который использует все ваши ядра для сжатия gzip. Ты можешь смотреть top и см. его, используя где-то между 200% -400 $ CPU. - Felipe Alvarez
Кажется, что переменная окружения GZIP_OPT, использование должно быть одинаковым. - Seer


Вместо того, чтобы использовать флаг gzip для tar, gzip файлы вручную после процесса tar, вы можете указать уровень сжатия для программы gzip:

tar -cvf files.tar /path/to/file0 /path/to/file1 ; gzip -9 files.tar

Или вы можете использовать:

tar cvf - /path/to/file0 /path/to/file1 | gzip -9 - > files.tar.gz

-9 в командной строке gzip сообщает gzip использовать максимально возможный уровень сжатия (по умолчанию - -6).

Редактировать: Исправлена ​​строка командной строки на основе комментария @depesz.


61
2017-07-01 18:25



Использование труб должно выполняться с помощью: tar cvf - /path/to/directory | gzip -9 - > file.tar.gz
1-й пример должен заканчиваться file.tar, поскольку gzip добавляет расширение .gz. - bonsaiviking
почему бы вам не пропустить f -? если нет файла, то это stdin / out - akostadinov
дополнение к предыдущему комментарию. Из раздела «man tar» Среда: TAPE Устройство или файл для использования в архиве, если --file не указан. Если эта переменная среды не установлена, вместо этого используйте stdin или stdout. - Mikl
и мы можем уменьшить «gzip -9 -» -> «gzip -9». Из раздела «man gzip» Описание: Если файлы не указаны или имя файла «-», стандартный ввод сжимается до стандартного вывода. - Mikl


Современные версии tar поддерживают формат архива xz (GNU tar, с 1,22 в 2009 году, Busybox начиная с 1.17.0 в 2010).

Он основан на LZMA2, вроде как 7-Zip версии GZ, Это дает лучшее сжатие, если вы в порядке с требованием поддержки xz.

tar -Jcvf file.tar.xz /path/to/directory

Я только что узнал Вот (в основном обман этого вопроса, но в Unix stackexchange), что есть также переменная среды XZ_OPT = -9 для управления уровнем сжатия XZ, аналогичным GZIP, в другом сообщении.

XZ_OPT=-9 tar -Jcvf file.tar.xz /path/to/directory

43
2017-12-19 03:03



+1 xz намного лучше, чем bzip2 и gzip. Вот сравнение: tukaani.org/lzma/benchmarks.html - User1
Компромисс - это скорость. XZ - существенно помедленнее. - Bell


tar cv /path/to/directory | gzip --best > file.tar.gz

Это второе решение Matrix Mole, но немного сокращено:

При вызове tar, опция f указывает, что вывод является файлом. Установка - (stdout) делает tar записывать свой вывод в stdout, который является поведением по умолчанию без обоих f а также -,

И как заявлено gzip man, если файлы не указаны, gzip будет сжиматься со стандартного ввода. Нет необходимости в - в gzip вызов.

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


25
2018-02-04 18:17



Это прекрасно работает. Также, если вы выполняете роль root, разрешения и владельцы также сохраняются. В противном случае вы должны указать. Также, если это не было очевидно, «-9» - лучшее сжатие, а «-1» - самое быстрое сжатие. «-1» по-прежнему занимает много времени, если у вас много файлов ;-) - PJ Brunet
Это работает с xz а также pixz слишком. Это отличный способ контролировать количество потоков, используемых для параллельного сжатия без создания промежуточного файла .tar. Вот так tar -cv /path/to/dir | pixz -p4 > output.tpxz - Joel Ostblom


Существует также возможность указать программу сжатия с использованием -I. Это может включать параметр уровня сжатия.

tar -I 'gzip -9' -cvf file.tar.gz /path/to/directory

9
2018-06-21 04:21



Старые версии tar, такие как предоставленные в CentOS 6 и 7, не поддерживают предоставление аргументов в -I arg, они будут пытаться рассматривать все это как имя программы для exec, и, таким образом, терпят неудачу. По крайней мере, из tar 1.29 в Debian Stretch это работает. - Cheetah