Поэтому мне нужно сжать каталог с максимальным сжатием.
Как я могу это сделать xz
? Я имею в виду, что мне тоже понадобится, tar
потому что я не могу сжать каталог только xz
. Есть ли oneliner для производства, например foo.tar.xz
?
Поэтому мне нужно сжать каталог с максимальным сжатием.
Как я могу это сделать xz
? Я имею в виду, что мне тоже понадобится, tar
потому что я не могу сжать каталог только xz
. Есть ли oneliner для производства, например foo.tar.xz
?
Ответы:
При условии xz
соблюдения стандартного набора флагов командной строки, включая флаги уровня сжатия, вы можете попробовать:
tar -cf - foo/ | xz -9 -c - > foo.tar.xz
-9e
лучший уровень, но это займет очень много времени
-9e
не всегда даст вам лучший результат - см. пункт 8 здесь rootusers.com/13-simple-xz-examples
--threads=0
в xz
С недавним GNU tar
на bash или производной оболочке:
XZ_OPT=-9 tar cJf tarfile.tar.xz directory
Переключатель j в нижнем регистре tar использует bzip, переключатель J в верхнем регистре использует xz.
XZ_OPT
Переменная среды позволяет установить xz
параметры , которые не могут быть переданы с помощью призывающих приложений , таких как tar
.
Это сейчас максимально .
Смотрите man xz
другие опции, которые вы можете установить ( -e
/ --extreme
может дать вам дополнительное преимущество сжатия для некоторых наборов данных).
XZ_OPT=-e9 tar cJf tarfile.tar.xz directory
rc
и akanga
. fish
, csh
, tcsh
И es
быть основные снаряды , которые не поддерживают его. Там вы бы использовали env
команду.
-9
и -e
xz, вы хотите, XZ_OPT=-e9
но, как указал @krzyk, -e очень медленно
XZ_OPT
это не функция, реализованная в tar
. Это особенность xz
. Когда tar
вызовы xz
, окр-переменная просто передается.
XZ_OPT=-9e tar cJf tarfile.tar.xz directory
даже лучше чем
XZ_OPT=-9 tar cJf tarfile.tar.xz directory
option -e, --extreme
Измените предустановку сжатия (-0 ... -9) так, чтобы можно было добиться чуть лучшей степени сжатия без увеличения использования памяти компрессором или декомпрессором (исключение: использование памяти компрессора может немного увеличиться с предустановками -0 ... -2). Недостатком является то, что время сжатия резко возрастет (оно может легко удвоиться).
-9
не -9e
, да?
XZ_OPT="-9e -T0" tar -cJf ...
Если у вас 16 ГБ ОЗУ (и больше ничего не работает), вы можете попробовать:
tar -cf - foo/ | xz --lzma2=dict=1536Mi,nice=273 -c - > foo.tar.xz
Для декомпрессии потребуется 1,5 ГиБ, а для сжатия - примерно в 11 раз. Отрегулируйте соответственно для меньшего количества памяти.
Это поможет только если данные на самом деле , что большой, и в любом случае это не поможет , ЧТО много, но все - таки ...
Если вы сжимаете двоичные файлы, добавьте --x86 в качестве первого параметра xz. Если вы играете с «мультимедийными» файлами (несжатый звук или растровые изображения), вы можете попробовать --delta = dist = 2 (поэкспериментируйте со значением, хорошие значения - 1..4).
Если вы чувствуете себя очень предприимчивым, вы можете попробовать поиграть с большим количеством опций LZMA, таких как
--lzma2=dict=1536Mi,nice=273,lc=3,lp=0,pb=2
(это настройки по умолчанию, вы можете попробовать значения от 0 до 4, а lc + lp не должен превышать 4)
Чтобы увидеть, как предустановки по умолчанию соответствуют этим значениям, вы можете проверить исходный файл src / liblzma / lzma / lzma_encoder_presets.c. Ничего особенного там нет (-e устанавливает красивую длину на 273, а также регулирует глубину).
Вы можете попробовать разные варианты, у меня -4е работает лучше
tar cf - wam_GG_${dir}.nc | xz -4e > wam_GG_${dir}.nc.tar.xz
Я проверил, запустив:
$ tar -cf - wam_GG.nc | xz -4e > wam_GG.nc.xz
$ tar -cf - wam_GG.nc | xz -9e > wam_GG.nc.xz.2
Так что, похоже, опция -4e работает немного лучше, чем -9e.
$ ll wam_GG.nc.xz*
-rw-rw-r--. 1 504 504 2707596 Jan 16 2015 wam_GG.nc.xz
-rw-rw-r--. 1 504 504 2708416 Jan 16 2015 wam_GG.nc.xz.2
no difference = 660 4e better than 9e = 74 9e better than 4e = 17 total files = 751 tar 2 html 2 csv 2 xml 2 gz 2 ppt 2 eps 2 docx 2 gif 2 rpm 3 png 3 asv 3 xlsx 3 exe 3 rar 4 nc 4 txt 5 odt 6 xls 7 zip 7 doc 9 m 12 dat 17 other 109 pdf 133 135 jpg 270
txt 109 txt/pdf 135
tar
использовании файлов xz
.
tar --help
: -I, --use-compress-program=PROG
tar -I 'xz -9' -cvf foo.tar.xz foo/
tar -I 'gzip -9' -cvf foo.tar.gz foo/
также сжимать с помощью внешних компрессоров:
tar -I 'lz4 -9' -cvf foo.tar.lz4 foo/
tar -I 'zstd -19' -cvf foo.tar.zst foo/
распаковать внешние компрессоры:
tar -I lz4 -xvf foo.tar.lz4
tar -I zstd -xvf foo.tar.zst
Архив списка внешних компрессоров:
tar -I lz4 -tvf foo.tar.lz4
tar -I zstd -tvf foo.tar.zst
-I
добавление объяснения опции .
tar
Команда использует J
флаг для файлов XZ. Пример:
tar -cJvf foo.tar.xz foo/
J
уже упоминалось в ответе Бодинга
Для тех, кто заинтересован, -e9
на 0,4% меньше, на 20% медленнее при сжатии, на 3% медленнее при декомпрессии по сравнению с -9
обычным ноутбуком. Вот время запуска в структуре каталогов исходного кода Python.
Сжатие:
$ Tbefore=`date +%s%3N` && XZ_OPT=-9 tar cJf python3.6.tar.9xz Python-3.6.0 && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"
43.87
$ Tbefore=`date +%s%3N` && XZ_OPT=-e9 tar cJf python3.6.tar.e9xz Python-3.6.0 && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"
53.861
Декомпрессия:
$ Tbefore=`date +%s%3N` && tar xf python3.6.tar.9xz && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)" && rm -rf Python-3.6.0
1.395
$ rm -rf Python-3.6.0
$ Tbefore=`date +%s%3N` && tar xf python3.6.tar.e9xz && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)" && rm -rf Python-3.6.0
1.443
Размер файла:
$ rm -rf Python-3.6.0
$ Tbefore=`date +%s%3N` && tar xf Python-3.6.0.tar.xz && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)" && rm -rf Python-3.6.0
1.49
$ ls -al ?ython*
-rw-rw-r-- 1 hobs hobs 16378500 Dec 23 13:06 python3.6.tar.9xz
-rw-rw-r-- 1 hobs hobs 16314420 Dec 23 13:05 python3.6.tar.e9xz
-rw-rw-r-- 1 hobs hobs 16805836 Dec 23 12:24 Python-3.6.0.tar.xz
Это не точный ответ на ваш вопрос, но вы можете использовать одну команду вместо двух:
7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on archive.7z dir1
добавляет все файлы из каталога "dir1" в архив archive.7z, используя "ultras ettings"
другие поддерживаемые форматы: zip, gzip, bzip2 или tar. для этого просто замени 7z
после -t
.
--источникman 7z
ПРИМЕЧАНИЕ: не используйте эту команду для резервного копирования системных файлов, кроме личных файлов, потому что формат 7z не хранит разрешения файловой системы .
На многоядерном компьютере с версией v5.2.0 xz-utils проверьте:
-T, --threads=NUM use at most NUM threads; the default is 1; set to 0
Если вы хотите использовать максимальное количество ядер и максимальное сжатие:
export XZ_DEFAULTS="-9 -T 0 "
Или установите -T на количество ядер, которые вы хотите использовать.
Затем:
tar cJf target.tar.xz source
Также это может быть полезно для выбора уровня сжатия:
Если вы хотите, чтобы это выполнялось быстрее, с использованием нескольких потоков, но без замедления работы вашей системы во время выполнения другой работы, попробуйте добавить, -Tn
где n - это количество потоков, которые вы хотите использовать, а также nice
снизить степень сжатия до приоритета простоя.
Модель (на 4 темы):
tar c foo/ | nice -n19 xz -9 -T4 > foo.tar.xz
Попробуйте посмотреть top
или htop
когда вы делаете это в большом каталоге (несколько ГБ). Надеемся, что вы увидите несколько xz
потоков со значением Nice 19 (самый низкий приоритет).
Я также сократил это до краткости и осмысленности, например: -f -
в других ответах просто нет необходимости, поскольку по tar
умолчанию выводом является stdout.
Вы также можете nice
обрабатывать tar, но я никогда не считал это необходимым, так как xz
всегда узкие места в CPU для конвейера.
Практическое замечание, я редко использую xz -9
для чего-либо, не столько из-за процессора или времени, но из-за высоких требований к памяти. Посмотрите на https://catchchallenger.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO#Memory_requirements_on_compression . xz
Компрессора, как bzip2
, но , в отличие gzip
, использует больше памяти для более высоких коэффициентов сжатия. Вместе с тем, что он xz
использует гораздо больше памяти, чем любой другой компрессор, вы можете легко использовать более 600 МБ памяти. А если вы используете -T
многопоточное сжатие, требования к памяти возрастают еще больше. Просто что-то, о чем нужно знать, например, если вы работаете с небольшим сервисом на маленькой виртуальной машине с 1-2 ГБ памяти, вы можете непреднамеренно оказать влияние.
В Mac OS X альтернативный подход к передаче параметра с tar
помощью использования --options=
флага. Например,
tar Jcvf targetFileName.tar.xz --options='compression-level=9' directoryName
man 1 xz
говоритit's not a good idea to blindly use -9 for everything like it often is with gzip(1) and bzip2(1).
-7 ... -9 [...] These are useful only when compressing files bigger than 8 MiB, 16 MiB, and 32 MiB, respectively.
RTFM для получения дополнительной информации.