Як вказати рівень стиснення при використанні tar -zcvf?


142

Я дуже часто працюю в каталогах. Те, що я зазвичай роблю, - це

tar -zcvf file.tar.gz /path/to/directory

Чи є спосіб вказати рівень стиснення тут? Я хочу використовувати найкраще можливе стиснення, навіть якщо для стиснення потрібно більше часу.

Відповіді:


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

припускаючи, що ви використовуєте bash. Як правило, встановіть змінну середовища GZIP на "-9" і запустіть tar нормально.

Також - якщо ви дійсно хочете найкращого стиснення, не використовуйте gzip. Використовуйте lzma або 7z.

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


14
pigz - це "паралельний gzip", який використовує всі ваші ядра для стиснення gzip. Ви можете його переглядати topта бачити, використовуючи будь-який процесор між 200% -400 $.
— Феліпе Альварес

2
FYI, для формату .bz2, використовуйте: BZIP2 = -9 tar cvjf file.tar.bz2 / path / to / directory
— Tomofumi

3
Здається, що змінна середовища зараз є GZIP_OPT, використання має бути однаковим.
— Провидник

3
Зі man сторінки на Ubuntu 16.04 для gzip: "У Vax / VMS назва змінної середовища є GZIP_OPT, щоб уникнути конфлікту із символом, встановленим для виклику програми." Для sh, csh та MSDOS це все одно має бути лише GZIP
— Ponyboy47

68

Замість використання прапора 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.


4
Використовувати труби слід з:tar cvf - /path/to/directory | gzip -9 - > file.tar.gz

1
1-й приклад повинен закінчуватися file.tar, оскільки gzipдодає розширення ".gz".
— бонсайвінг

4
чому ти не пропустиш f -? якщо немає файлу, то це stdin / out
— akostadinov

на додаток до коментаря previos. З розділу "man tar" Навколишнє середовище: TAPE Пристрій або файл, який потрібно використовувати для архіву, якщо --file не вказано. Якщо ця змінна середовище не встановлена, замість цього використовуйте stdin або stdout.
— Мікл

2
і ми можемо зменшити "gzip -9 -" -> "gzip -9". З розділу "man gzip" Опис: Якщо жодні файли не вказані, або якщо ім'я файлу є "-", стандартний вклад стискається до стандартного виводу.
— Мікл

53

Сучасні версії 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 stackexchange), що існує також змінна середовища XZ_OPT = -9 для управління рівнем стиснення XZ, подібним GZIP в іншому пості.

XZ_OPT=-9 tar -Jcvf file.tar.xz /path/to/directory

2
+1 xz набагато краще, ніж bzip2 та gzip. Ось порівняння: tukaani.org/lzma/benchmarks.html
— User1

8
Компроміс - це швидкість. XZ значно повільніше.
— Белл

32
tar cv /path/to/directory | gzip --best > file.tar.gz

Це друге рішення Matrix Mole, але трохи скорочене:

При виклику tar, параметр fзазначає, що вихід - файл. Якщо встановити його на -(stdout), тар записує свій вихід у stdout, що є поведінкою за замовчуванням без обох fі -.

І як зазначено на сторінці gzipman, якщо файли не вказані, gzip буде стискатися зі стандартного вводу. Там немає необхідності -в gzipвиклику.

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


1
Це прекрасно працює. Крім того, якщо ви працюєте як root, дозволи та власники також зберігаються. В іншому випадку потрібно вказати. Крім того, якщо це не було очевидно, "-9" - найкраще стиснення, а "-1" - найшвидше стиснення. "-1" все ще триває довгий час, якщо у вас багато файлів ;-)
— PJ Brunet

Це працює з xzі pixzтеж. Це прекрасний спосіб контролювати кількість потоків, які використовуються для паралельного стиснення, без необхідності створювати проміжний файл .tar. Так іtar -cv /path/to/dir | pixz -p4 > output.tpxz
— joelostblom

10

Також є можливість вказати програму стиснення за допомогою -I. Це може включати параметр рівня стиснення.

tar -I 'gzip -9' -cvf file.tar.gz /path/to/directory

2
Старіші версії tar, такі як, представлені у CentOS 6 і 7, не підтримують надання аргументів у -Iаргументі, вони намагатимуться трактувати всю річ як ім'я програми для виконання, і, таким чином, не вдасться. Принаймні, з вмістом 1,29 дьогтю в Debian Stretch, це працює.
— Гепард

2

І звичайно, macOS-похідний bsd має бути різним:

tar -czf file.tar.gz --options gzip:compression-level=9 /path/to/directory
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.