it-swarm.com.ru

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

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

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

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

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

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

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

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

130
user7385

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

63
Matrix Mole

Современные версии 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
47
David C. Bishop
tar cv /path/to/directory | gzip --best > file.tar.gz

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

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

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

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

29
carlito

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

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

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

tar -czf file.tar.gz --options gzip:compression-level=9 /path/to/directory
2
rfay