- Как указать уровень сжатия при использовании tar -zcvf?
- 6 ответов 6
- Максимальная степень сжатия
- Как получить максимальное сжатие с .tar.gz? [Дубликат]
- 🐧 Как сжать весь каталог с помощью xz и tar в системах Linux
- Использование xz для одного файла
- Выбор предустановленного уровня сжатия
- Декомпрессия файла
- Сжатие всего каталога с помощью xz и tar
- Использование tar с xz для нескольких файлов и каталогов
- Заключение
Как указать уровень сжатия при использовании tar -zcvf?
Есть ли способ указать уровень сжатия здесь? Я хочу использовать максимально возможное сжатие, даже если для его сжатия требуется больше времени.
6 ответов 6
GZIP=-9 tar cvzf file.tar.gz /path/to/directory
при условии, что вы используете Bash. Как правило, установите для переменной среды GZIP значение «-9» и обычно запускайте tar.
Кроме того — если вы действительно хотите лучшее сжатие, не используйте gzip. Используйте lzma или 7z.
И при использовании gzip (что в любом случае является хорошей идеей по разным причинам) рассмотрите возможность использования программы pigz а не gzip .
Вместо использования флага 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.
Современные версии 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
tar cv /path/to/directory | gzip --best > file.tar.gz
Это второе решение Matrix Mole, но немного сокращенное:
При вызове tar опция f указывает, что вывод является файлом. Установка его в — (stdout) заставляет tar записывать свои выходные данные в stdout, который является поведением по умолчанию без f и — .
И, как указано на справочной странице gzip , если файлы не указаны, gzip будет сжиматься из стандартного ввода. Нет необходимости — в вызове gzip .
Опция —best (эквивалентно -9 ) устанавливает самый высокий уровень сжатия.
Максимальная степень сжатия
Нужно сжать файлы в общем объеме 500-1000 Мб. Что посоветуете? Какие опции? Желатьно сжимать через консоль или есть гуевый архиватор где можно указать степень сжатия?
tar — это архиватор, а не компрессор. По сабжу — нынче вроде модно lzma юзать.
Либо ты не умеешь нормально формулировать вопрос, либо одно из двух.
tar c . |xz —best —extreme >out.tar.xz
У него хорошая степень сжатия?
не умеешь нормально формулировать вопрос
Меня не волнует формулировка вопроса, меня волнует результат, и ничего больше.
w1nner ★★★★★ ( 15.08.14 01:31:24 MSK )
Последнее исправление: w1nner 15.08.14 01:33:20 MSK (всего исправлений: 1)
Время важно или критичен объём? Если просто хорошо сжать, то 7zip (в гугле найдёшь, как жать или ман прочитаешь). Если тебе делать нечего и хочется сжать до предела (времени у тебя на это уйдёт много, может месяц), то что-то на основе paq алгоритмов. Да, вот ещё, если права на файлы нужны, то сначала в tar собери. Можно ещё xz использовать, он неплохо жмёт. А стандартно применяют tar+gzip/tar+bzip.
Сейчас протестировал, сжал каталог с файлами размером в 400Мб, xz и lzma показали одинаковый результат в 93Мб, хуже показал себя bz2 в 116Мб. Пока остановился на lzma.
greenman ★★★★★ ( 15.08.14 06:46:18 MSK )
Последнее исправление: greenman 15.08.14 06:47:43 MSK (всего исправлений: 1)
xz — это LZMA2, практически тот же LZMA, только с рядом улучшений, смысла использовать устаревший LZMA нет никакого.
XZ_OPT="--best --extreme" tar cJf filename.tar.xz .
Как получить максимальное сжатие с .tar.gz? [Дубликат]
Как я понимаю, использование tar + gzip заключается в том, что tar обычно он используется для объединения группы файлов в один файл, а затем gzip используется для сжатия этого файла.
Я недавно узнал, что tar можно также сжимать.
Поскольку я не до конца понимаю, как работает сжатие @ это ядро, у меня есть (возможно, нелепые) опасения, что отправка предварительно сжатого .tar в gzip может помешать сжатию gzip, а также его возможному разрешению и тому подобному.
По сути, мой вопрос: какую комбинацию методов args / сжатие я должен использовать для создания абсолютного наименьшего tar.gz, и как для этого выглядит выражение командной строки?
Сжатие уже сжатых файлов может уменьшить их размер или увеличить размер архива. Все зависит от типа данных и используемого сжатия.
Что сказал @Keltari. Степени сжатия и коэффициенты сильно зависят от того, что именно вы сжимаете, поэтому также существуют разные алгоритмы и методы сжатия.
Или вы можете указать tar пользователю максимальное сжатие следующим образом:
export GZIP=-9 tar cvzf file.tar.gz /path/to/directory
Кроме того, чтобы ваши envvars были свободными от помех, вы можете сделать это:
env GZIP=-9 tar cvzf file.tar.gz /path/to/directory
Как вы сказали, « tar может также сжимать », это означает, что — tar не всегда сжимает данные сам по себе.
Это делается только при использовании с z опцией. Это тоже не само по себе, но — путем передачи данных через gzip.
Однако вместо этого, как отмечено в этом ответе, вы можете направить две команды: tar & так gzip , чтобы вы могли явно указать уровень сжатия для gzip команды, чтобы получить наименьший выходной размер.
tar cvf — / путь / к / каталогу | gzip -9 -> file.tar.gz
Здесь 9 указывается максимально возможный уровень сжатия.
У меня была проблема, когда он не рекурсивный, и жалуется, что это будет пустой архив, так как команда разбита, трудно найти, как правильно вызвать рекурсив, так как его уже tar по умолчанию. МОЙ ПЛОХОЙ, я неправильно определил это, начиная с этого tar -cvf /path
Обычно ни gzip, ни tar не могут создать «самый маленький tar.gz». Есть много утилит сжатия, которые могут сжимать до формата gz. Я написал Баш скрипт « gz99 » , чтобы попробовать gzip , 7z и , advdef чтобы получить файл наименьшего. Чтобы использовать это для создания наименьшего возможного запуска файла:
tar c path/to/data | gz99 file.gz
advdef Утилита от AdvanceCOMP обычно дает наименьший размер, но и глючит (то gz99 утилита проверяет , что он не поврежден файл , прежде чем принять выход advdef ). Для advdef непосредственного использования создайте файл .tar.gz так, как вам хочется. Затем запустите:
Это создаст стандартный файл gz, который может быть прочитан gzip и tar как обычно, чуть меньше. Это лучшее из того, что вы можете сделать с форматом gz.
Поскольку вы только недавно узнали, что tar может сжимать, и не сказали, зачем вам нужен самый маленький файл «.tar.gz», вы можете не знать, что есть более эффективные форматы, которые можно использовать с файлами tar, например, xz. Как правило, переключение на другой формат может дать намного лучшее улучшение сжатия, чем перебор с опциями gzip. Основным недостатком xz является то, что он не так распространен, как gzip, поэтому людям, которым вы отправляете файл, возможно, придется установить новый пакет. Это также имеет тенденцию быть немного медленнее, особенно при сжатии. Если это не имеет значения для вас, и вы действительно хотите самый маленький файл tar, попробуйте:
tar cv path/to/data | xz -9 > file.tar.xz
Современные версии tar, например в Ubuntu 13.10, автоматически обнаруживают сжатые файлы. Так что даже если вы используете сжатие xz, вы все равно можете распаковать как обычно:
Чтобы быстро понять, как сравниваются эти утилиты сжатия, рассмотрим эффект сжатия patch-3.1.1 из ядра Linux:
utility cpu format size(bytes) gzip -9 0.02s gz 105,628 advdef -2 0.07s gz 102,619 7z -mx=9 -tgzip 0.42s gz 102,297 advdef -3 0.55s gz 102,290 advdef -4 0.75s gz 101,956 xz -9 0.03s xz 91,064 xz -3e 0.15s xz 90,996
В этом тривиальном примере мы видим, что для получения наименьшего gz нам нужен advdef (хотя 7z -tgzip почти так же хорош и намного менее глючит). Мы также видим, что переключение на xz дает нам гораздо больше места, чем попытка выжать максимум из старого формата gz без сжатия, которое занимает слишком много времени.
ОП спросил, как получить наибольшее сжатие для файла .tar.gz, но вы предложили создать файл .tar.xz. Вы отвечаете на вопрос, отличный от заданного.
Ах, я вижу, что вы собираетесь. advdef просто падает в моей системе (v1.15), поэтому ‘advdef -z -4 file.tar.gz’ не работает, но, по крайней мере, теоретически может. Я не могу найти доказательств того, что это уменьшит файл дальше, чем «gzip -9», но это может быть, и в любом случае мне достаточно, чтобы убрать свой голос -1. Спасибо за разъяснение!
Хм, я использую v1.17. Во всяком случае, педантичный математик во мне хочет указать, что мой ответ, возможно, технически неверен. В конце концов, если вы перечислите все возможные файлы gz от самого короткого до самого длинного и выберете первый файл, который распаковывается в нужный файл, вы можете сократить еще несколько байтов. Но это было бы слишком медленно на практике.
Я не думаю, что «багги» и «архив» должны когда-либо использоваться вместе, зачем использовать поврежденный архив? Вам нужен гораздо больший файл, чтобы «сравнивать» утилиты сжатия, а также разные типы входных файлов — измерение с точностью до сотых долей секунды не так уж надежно, я думаю, что xz -9 обычно требуется примерно 5-кратное gz -9 время, а не только 1,5- кратное ваш стол подсказывает.
🐧 Как сжать весь каталог с помощью xz и tar в системах Linux
Команда xz в Linux, macOS, *BSD и Unix-подобных системах обеспечивает превосходное сжатие.
Она превосходит zip и другие форматы, когда мы используем xz вместе с tar для максимального уменьшения размера.
Например, я сжал каталог размером 37M, используя xz и zip.
Размер файла zip составил 31М, а файла xz – 16М после сжатия.
Довольно впечатляюще, не правда ли?
Давайте посмотрим, как сжать весь каталог с помощью xz и tar.
Как я уже говорил, использование xz для сжатия и распаковки файлов из командной строки Unix и Linux обеспечивает превосходный коэффициент сжатия.
В результате я получил архивы гораздо меньшего размера, чем при сжатии файлов с помощью команд zip/gzip.
Давайте воспользуемся командами xz и tar для сжатия каталога while в Linux и Unix.
Использование xz для одного файла
xz filename
xz [option] filename
В этом примере я собираюсь сжать один файл с именем firc.pdf:firc.img
Проверьте его с помощью команды ls:
Передайте параметр -v, чтобы увидеть прогресс:
xz -v filename xz -v resume.doc
Выбор предустановленного уровня сжатия
Мы можем задать уровни сжатия от 0 до 9 с помощью цифры:
xz - filename xz - filename
По умолчанию используется уровень -6.
Но можно использовать -9 следующим образом:
xz -9 filename xz -9 -v filename
Выбранные настройки сжатия определяют требования к памяти декомпрессора.
Таким образом, использование слишком высокого уровня предустановки может привести к тому, что распаковка файла на старой системе с небольшим объемом оперативной памяти будет затруднена.
Уровень | Описание |
---|---|
-0 до -3 | -0 иногда быстрее, чем gzip, при этом сжимает гораздо лучше. |
-4 до -6 | Хорошее или очень хорошее сжатие при разумном использовании памяти декомпрессора даже для старой системы |
-7 до -9 | Они похожи на -6, но требуют больше памяти для компрессора и декомпрессора. Они полезны только при сжатии файлов размером более 8, 16 и 32 Мб соответственно. |
Декомпрессия файла
Для распаковки передайте следующие параметры:
xz -d file.xz
xz —decompress resume.doc.xz
xz —uncompress cake_php.music_raw.xz
xz -d -v firc.pdf.xz
Сжатие всего каталога с помощью xz и tar
По умолчанию xz сжимает только один файл.
Как же сжать весь каталог с помощью xz?
Нам нужно использовать комбинацию команд tar и xz.
Синтаксис зависит от того, насколько портативной должна быть команда.
Как xz каталог с помощью tar с максимальным сжатием
Самый простой синтаксис следующий:
tar -cJf archive.tar.xz dir1
tar -cvJf archive.tar.xz /path/to/appdir1/
# state compression level to 9 #
XZ_OPT=’-9′ tar -cvJf mywebsite.backup.tar.xz /var/www/html/
You can also use verbose syntax to state the -v and -9 option as follows:
tar cf itisgood.tar.xz \
—use-compress-program=’xz -9v’ \
~/projects/wp/cbz_blog/
Использование tar с xz для нескольких файлов и каталогов
Портативная версия выглядит следующим образом
tar -cf – /path/to/dir | xz -9ze -T0 >output.tar.xz
Например, давайте сожмем каталог SalesData в текущем местоположении.
Но сначала узнайте размер папки с помощью команды du:
$ du -csh SalesData/
37M SalesData/
37M total
tar -cf — SalesData | xz -9ze -T0 >SalesData.txz
## или ##
tar -cf — SalesData | xz -9ze -T0 >SalesData.tar.xz
Заключение
Мы рассмотрели, как использовать команду xz для сжатия и распаковки отдельных файлов.
Затем разобрались как использовать tar с xz для нескольких файлов и каталогов.