Вопрос или проблема
Я часто сжимаю директории с помощью gzip на работе. Обычно я делаю это так:
tar -zcvf file.tar.gz /path/to/directory
Есть ли способ указать уровень сжатия здесь? Я хочу использовать лучшее сжатие, даже если это займет больше времени.
GZIP=-9 tar cvzf file.tar.gz /path/to/directory
если вы используете bash. В общем, установите GZIP
переменную окружения на “-9”, и запускайте tar как обычно.
Также, если вы действительно хотите лучшее сжатие, не используйте gzip. Используйте lzma или 7z.
И если вы все-таки используете gzip (что хорошая идея по ряду причин), рассмотрите возможность использования программы pigz
вместо gzip
.
Вместо использования флага gzip для tar, сжимайте файлы вручную после процесса 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).
Редактирование: Исправлена команда с pipe на основе комментария @depesz.
Современные версии 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
Как указано в этом похожем вопросе, также существует переменная окружения XZ_OPT
для контроля уровня сжатия XZ (похоже на GZIP
в ответе user7385). Например, для максимального (уровень 9) сжатия:
XZ_OPT=-9 tar -Jcvf file.tar.xz /path/to/directory
tar cv /path/to/directory | gzip --best > file.tar.gz
Это второе решение Matrix Mole, но слегка укороченное:
Когда вызывается tar, опция f
указывает, что вывод будет в файл. Установка в -
(stdout) заставляет tar выводить данные в stdout, что является поведением по умолчанию без f
и -
.
И как указано на странице руководства gzip
, если файлы не указаны, gzip будет сжимать из стандартного ввода. Нет необходимости в -
в вызове gzip
.
Опция --best
(эквивалентна -9
) устанавливает самый высокий уровень сжатия.
Начиная с GNU tar 1.27 (2013), также появилась возможность указать программу сжатия с помощью -I
. Это может включать опцию уровня сжатия.
tar -I 'gzip -9' -cvf file.tar.gz /path/to/directory
Обратите внимание, что опция -I
является сокращением для --use-compress-program=COMMAND
. Это важно, если вы используете не GNU tar
, а BSD tar
. В последнем случае опция -I
используется как сокращение для --files-from filename
.
Таким образом, чтобы сделать вашу команду “кросс-платформенной”, вы можете написать:
tar --use-compress-program='gzip -9' -cvf file.tar.gz /path/to/directory
И, конечно, macOS bsd-derived tar отличается:
tar -czf file.tar.gz --options gzip:compression-level=9 /path/to/directory
.
Ответ или решение
Чтобы указать уровень сжатия при использовании команды tar -zcvf
с gzip
, существуют несколько подходов, которые зависят от ваших требований к времени выполнения и уровню сжатия. Рассмотрим различные способы, как можно достичь наилучшего уровня компрессии при архивации данных в Linux и UNIX-системах.
Использование переменной окружения GZIP
Один из способов – это установить переменную окружения GZIP
на нужный уровень сжатия. Для максимального уровня, используйте значение -9
. Введите следующую команду в терминале:
GZIP=-9 tar -zcvf file.tar.gz /path/to/directory
Этот подход подойдет для пользователей bash и позволяет автоматизировать процесс без дополнительных команд.
Последовательное архивирование и сжатие
Другой способ – сначала создать архив, а затем его сжать вручную с помощью gzip
:
tar -cvf file.tar /path/to/directory
gzip -9 file.tar
Использование конвейера с gzip
Вы можете также воспользоваться конвейером для передачи данных из tar
в gzip
с заданным уровнем сжатия:
tar -cvf - /path/to/directory | gzip -9 > file.tar.gz
Использование других инструментов для сжатия
Если вы стремитесь к лучшему уровню сжатия, чем способен предложить gzip
, рассмотрите такие варианты, как xz
или 7z
. Метод архивирования с xz
:
XZ_OPT=-9 tar -Jcvf file.tar.xz /path/to/directory
Использование xz
обычно обеспечивает более высокий уровень сжатия по сравнению с gzip
, хотя и требует больше времени.
Поддержка разных версий tar
Начиная с версии GNU tar 1.27, вы можете указать программу-компрессор и параметры через опцию -I
:
tar -I 'gzip -9' -cvf file.tar.gz /path/to/directory
Обратите внимание, что использование опции -I
делает команду более совместимой с разными версиями tar
, такими как BSD tar.
Специфика для macOS
На macOS, которая использует bsd-подобную версию tar
, применяйте следующую команду:
tar -czf file.tar.gz --options gzip:compression-level=9 /path/to/directory
Рекомендации
Для достижения наилучшего сжатия и производительности, рекомендуется также рассмотреть использование программы pigz
(параллельная реализация gzip
), которая ускоряет процесс за счет использования многоядерных процессоров.
Такой всесторонний подход позволяет гибко настроить создание архивов под ваши нужды, учитывая особенности аппаратного обеспечения и требуемого уровня компрессии. Выбор между временем и степенью сжатия позволит вам оптимально взаимодействовать с данными, увеличивая эффективность работы в IT-сфере.