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


143

Я очень часто гзип каталоги на работе. Что я обычно делаю

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

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

Ответы:


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

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

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

А при использовании gzip (что в любом случае является хорошей идеей по разным причинам) рассмотрите возможность использования pigzпрограммы, а не программы gzip.


14
pigz - это "параллельный gzip", который использует все ваши ядра для сжатия gzip. Вы можете смотреть topи видеть его, используя где-то между 200% -400 $ процессора.
Фелипе Альварес

2
К сведению, для формата .bz2 используйте: BZIP2 = -9 tar cvjf file.tar.bz2 / path / to / directory
Tomofumi

3
Кажется, переменная окружения теперь GZIP_OPTтакая же, как и при использовании.
Провидец

3
На странице руководства в Ubuntu 16.04 для gzip: «В Vax / VMS имя переменной среды - GZIP_OPT, чтобы избежать конфликта с набором символов для вызова программы». Для sh, csh и MSDOS это должен быть только GZIP
Ponyboy47

68

Вместо использования флага 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.


4
Использование труб должно быть сделано с:tar cvf - /path/to/directory | gzip -9 - > file.tar.gz

1
Первый пример должен заканчиваться file.tar, так как gzipдобавляет расширение .gz.
Бонсайвинг

4
почему бы тебе не пропустить f -? если файла нет, то это stdin / out
akostadinov

дополнение к предыдущему комментарию. Из раздела "man tar" Среда: TAPE Устройство или файл, который будет использоваться для архива, если --file не указан. Если эта переменная среды не установлена, используйте вместо нее stdin или stdout.
Микл

2
и мы можем уменьшить "gzip -9 -" -> "gzip -9". Из раздела «man gzip» Описание: Если файлы не указаны или имя файла «-», стандартный ввод сжимается до стандартного вывода.
Микл

53

Современные версии 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), что есть также переменная окружения XZ_OPT = -9 для управления уровнем сжатия XZ, аналогичным GZIP в другом посте.

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

2
+1 xz намного лучше, чем bzip2 и gzip. Вот сравнение: tukaani.org/lzma/benchmarks.html
User1

8
Компромисс - скорость. XZ значительно медленнее.
Звонок

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

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

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

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

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


1
Это прекрасно работает. Также, если вы запускаете с правами root, права и владельцы также сохраняются. В противном случае вы должны указать. Также, если это не было очевидно, «-9» - лучшее сжатие, а «-1» - самое быстрое сжатие. «-1» все еще занимает много времени, если у вас много файлов ;-)
PJ Brunet

Это работает с xzи pixzтоже. Это отличный способ контролировать количество потоков, используемых для параллельного сжатия, без необходимости создавать промежуточный файл .tar. tar -cv /path/to/dir | pixz -p4 > output.tpxz
Вот

10

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

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

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

2

И, конечно же, tar-файл macOS bsd должен быть другим:

tar -czf file.tar.gz --options gzip:compression-level=9 /path/to/directory
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.