Як отримати максимальну компресію за допомогою .tar.gz? [дублікат]


63

На це питання вже є відповідь тут:

Як я розумію використання tar + gzip, це те, що tarзазвичай використовується для консолідації групування файлів в один файл, потім gzipвикористовується для стиснення цього файлу.

Нещодавно я дізнався, що tarможе також стискатися.

Оскільки я не повністю розумію, як спрацьовує компресія @ це ядро, у мене є (можливо, смішні) проблеми, що надсилання попередньо стисненого .tar до gzip може запобігти стисканню gzip, оскільки його потенціал дозволить і речі такого характеру.

Моє питання по суті: Яку комбінацію аргументів / методів стиснення я повинен використовувати для створення абсолютного найменшого tar.gz, і як виглядає для цього команда командного рядка?


2
Стиснення вже стислих файлів може зменшити їх розмір, або може збільшити архів. Все залежить від типу даних та будь-якого використовуваного стиснення.
Keltari

Що сказав @Keltari Швидкість і коефіцієнти стиснення сильно залежать від того, що саме ви стискаєте, тому також існують різні алгоритми та методи стиснення.
music2myear

Відповіді:


111

Або ви можете сказати tar для максимальної компресії користувача таким чином:

export GZIP=-9
tar cvzf file.tar.gz /path/to/directory

Крім того, щоб зберегти безперервне середовище, ви можете зробити це:

env GZIP=-9 tar cvzf file.tar.gz /path/to/directory

43

Як ви заявили, « дьоготь може також стискатися », це означає, що - tarне завжди стискає дані сам по собі.

Це робиться лише тоді, коли використовується з zопцією. Це теж не саме по собі, а - шляхом передачі даних, що виділяються, через gzip.

Однак замість цього, як зазначено у цій відповіді, ви можете передавати дві команди: tar& gzipтакі, що ви можете чітко вказати рівень стиснення для gzipкоманди для досягнення найменшого розміру виводу.

tar cvf - / шлях / до / каталог | gzip -9 -> file.tar.gz

Тут 9вказується максимально можливий рівень стиснення.


У мене виникла проблема, коли вона не рекурсивна, і скаржиться, що це буде порожній архів, оскільки команда розділена, важко знайти, як правильно примусити рекурсивно, оскільки її вже за замовчуванням є tar. МОЙ БАД, я неправильно вказав це, починаючи такtar -cvf /path
Брайан Томас

17

Зазвичай ні gzip, ні tar не можуть створити "найменший tar.gz". Існує багато утиліт стиснення, які можуть стискати формат gz. Я написав скрипт bash " gz99 ", щоб спробувати gzip, 7zі advdefотримати найменший файл. Щоб використовувати це для створення найменшого можливого запуску файлу:

tar c path/to/data | gz99 file.gz

advdefУтиліта від AdvanceCOMP зазвичай дає найменший розмір, а й глючить (то gz99перевірки корисності , що він не пошкоджений файл , перш ніж прийняти вихід advdef). Щоб advdefбезпосередньо користуватися, створіть file.tar.gz, проте ви хочете. Потім запустіть:

advdef -z -4 file.tar.gz

Це створить стандартний файл gz, який можна зчитувати за допомогою gzip та tar як звичайний, лише трохи менше. Це про найкраще, що ви можете зробити з форматом gz.

Оскільки ви нещодавно дізналися, що смола може стискатися, і не сказали, чому ви хочете найменший файл ".tar.gz", можливо, ви не знаєте, що для файлів tar, таких як xz, можна використовувати більш ефективні формати. Як правило, перемикання на інший формат може значно покращити стиснення, ніж обертання з параметрами gzip. Основним недоліком xz є те, що він не настільки поширений, як gzip, тому люди, яким ви надсилаєте файл, можливо, повинні встановити новий пакет. Він також має тенденцію бути трохи повільніше, особливо при стисканні. Якщо це для вас не має значення, і ви дійсно хочете найменший файл tar, спробуйте:

 tar cv path/to/data | xz -9 > file.tar.xz

Сучасні версії tar, наприклад на Ubuntu 13.10, автоматично виявляють стислі файли. Тож навіть якщо ви використовуєте компресію xz, ви все одно можете розпакувати, як завжди:

 tar xvf file.tar.xz

Щоб швидко зрозуміти, як порівнюють ці утиліти стиснення, розглянемо ефект стиснення патча-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

У цьому тривіальному прикладі ми бачимо, що для отримання найменшого гц нам потрібен advdef (хоча 7z -tgzip майже такий же гарний і набагато менше баггі). Ми також бачимо, що перемикання на xz отримує нам набагато більше місця, ніж намагання максимально вичавити зі старого формату gz, не стикаючи занадто довго.


ОП запитала, як отримати найбільшу компресію для файлу .tar.gz, але ви запропонували створити файл .tar.xz. Ви відповідаєте на інше запитання, ніж на запитання.
ChrisInEdmonton

Ах, я бачу, на що ти йдеш. advdef просто виходить з ладу в моїй системі (v1.15), тому "advdef -z -4 file.tar.gz" не працює, але це принаймні теоретично могло б. Я не можу знайти доказів того, що він би скоротив файл далі, ніж 'gzip -9', але це може бути, і в будь-якому випадку мені достатньо, щоб зняти свій -1 голос. Дякуємо за уточнення!
ChrisInEdmonton

Хм, я використовую v1.17. У будь-якому випадку педантичний математик в мені хоче зазначити, що моя відповідь, можливо, не є технічно правильною. Зрештою, якщо ви перерахуєте всі можливі файли gz від найкоротшого до найдовшого та виберіть перший, який розпаковується до потрібного файлу, ви можете поголити ще кілька байтів. Але це було б занадто повільно на практиці.
gmatht

Я не думаю, що "баггі" та "архів" ніколи не слід використовувати разом, яке використання - це пошкоджений архів? Вам потрібен набагато більший файл, щоб "порівняти" утиліти стиснення, а також різні типи вхідних файлів - вимірювання в сотих частках секунди не настільки надійне, я думаю, що xz -9зазвичай потрібно щось на кшталт 5 gz -9разів, а не лише 1,5x, як ваша таблиця пропонує.
Xen2050

як ми можемо створити розділені архіви (під час стискання), використовуючи процес xz, будь ласка
nyxee

6
tar c /path/to/data | gzip --best > file.tar.gz

gzipопція --best(еквівалентна -9) запитує найвищий рівень стиснення.


4
Крім того, використовувати --bestпрапор: -9 плутає читача.
om-nom-nom
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.