Тому мені потрібно стиснути каталог з максимальним стисненням.
Як я можу це зробити xz
? Я маю на увазі, що мені це знадобиться, tar
тому що я не можу стискати лише каталог xz
. Чи є однолінійник для виробництва, наприклад foo.tar.xz
?
Тому мені потрібно стиснути каталог з максимальним стисненням.
Як я можу це зробити xz
? Я маю на увазі, що мені це знадобиться, tar
тому що я не можу стискати лише каталог xz
. Чи є однолінійник для виробництва, наприклад 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 використовується 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 opts, ви хочете, XZ_OPT=-e9
але як зазначав @krzyk, -e надзвичайно повільно
XZ_OPT
це не функція, реалізована в tar
. Це особливість xz
. Під час tar
дзвінків xz
змінна env просто передається.
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. Нічого особливого цікавого там немає (-е встановлює хорошу довжину в 273, а також регулює глибину).
Ви можете спробувати різні варіанти, для мене -4e працює краще
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
.
Для тих, хто цікавиться, -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" в архів архіву.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
також обробляти смолу, але я ніколи не вважав це необхідним, як xz
завжди вузькі місця процесора для конвеєра.
Практична примітка, я рідко використовую 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
для ввімкнення потокового стиснення, вимоги до пам'яті збільшуються ще більше. Просто щось, про що слід пам’ятати, наприклад, якщо ви користуєтеся невеликим сервісом на невеликому VM з 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 для отримання додаткової інформації.