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

Вопрос или проблема

Я часто сжимаю директории с помощью 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-сфере.

Оцените материал
Добавить комментарий

Капча загружается...