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