Bagaimana cara menentukan tingkat kompresi saat menggunakan tar -zcvf?

143

Saya sering direktori gzip di tempat kerja. Apa yang biasanya saya lakukan adalah

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

Apakah ada cara untuk menentukan level kompresi di sini? Saya ingin menggunakan kompresi terbaik bahkan jika dibutuhkan lebih banyak waktu untuk kompres.

Lazer
sumber

Jawaban:

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

dengan asumsi Anda menggunakan bash. Secara umum, atur variabel lingkungan GZIP ke "-9", dan jalankan tar secara normal.

Juga - jika Anda benar-benar menginginkan kompresi terbaik, jangan gunakan gzip. Gunakan lzma atau 7z.

Dan ketika menggunakan gzip (yang merupakan ide bagus karena berbagai alasan pula) pertimbangkan untuk menggunakan pigzprogram dan bukan gzip.


sumber
14
pigz adalah "gzip paralel" yang menggunakan semua inti Anda untuk kompresi gzip. Anda dapat menonton topdan melihatnya menggunakan CPU mana saja antara 200% -400 $.
Felipe Alvarez
2
FYI, untuk format .bz2, gunakan: BZIP2 = -9 tar file cvjf.tar.bz2 / path / ke / direktori
Tomofumi
3
Variabel lingkungan tampaknya sekarang adalah GZIP_OPT, penggunaannya harus sama.
Pelihat
3
Dari halaman manual di Ubuntu 16.04 untuk gzip: "Pada Vax / VMS, nama variabel lingkungan adalah GZIP_OPT, untuk menghindari konflik dengan simbol yang ditetapkan untuk pemanggilan program." Untuk sh, csh, dan MSDOS seharusnya masih berupa GZIP
Ponyboy47
68

Alih-alih menggunakan flag gzip untuk tar, gzip file secara manual setelah proses tar, maka Anda dapat menentukan tingkat kompresi untuk program gzip:

tar -cvf files.tar /path/to/file0 /path/to/file1 ; gzip -9 files.tar

Atau Anda bisa menggunakan:

tar cvf - /path/to/file0 /path/to/file1 | gzip -9 - > files.tar.gz

-9 pada baris perintah gzip memberitahu gzip untuk menggunakan tingkat kompresi maksimum yang dimungkinkan (standarnya adalah -6).

Sunting: Memperbaiki baris perintah pipa berdasarkan komentar @depesz.

Matriks Mole
sumber
4
Menggunakan pipa harus dilakukan dengan:tar cvf - /path/to/directory | gzip -9 - > file.tar.gz
1
Contoh pertama harus diakhiri dengan file.tar, karena gzipmenambahkan ekstensi ".gz".
bonsaiviking
4
kenapa tidak kamu lewati f -? jika tidak ada file, maka itu stdin / out
akostadinov
Selain komentar previos. Dari bagian "man tar" Environtment: TAPE Perangkat atau file yang akan digunakan untuk arsip jika --file tidak ditentukan. Jika variabel lingkungan ini tidak disetel, gunakan stdin atau stdout sebagai gantinya.
Mikl
2
dan kita dapat mengurangi "gzip -9 -" -> "gzip -9". Dari bagian "man gzip" Keterangan: Jika tidak ada file yang ditentukan, atau jika nama file "-", input standar dikompresi ke output standar.
Mikl
53

Versi tar modern mendukung format arsip xz (GNU tar, sejak 1.22 pada 2009, Busybox sejak 1.17.0 pada 2010).

Ini didasarkan pada lzma2 , seperti versi 7-Zip dari gz . Ini memberikan kompresi yang lebih baik jika Anda baik-baik saja dengan persyaratan membutuhkan dukungan xz.

tar -Jcvf file.tar.xz /path/to/directory

Saya baru saja menemukan di sini (pada dasarnya dupe dari pertanyaan ini, tetapi di Unix stackexchange) bahwa ada juga variabel lingkungan XZ_OPT = -9 untuk mengontrol tingkat kompresi XZ mirip dengan yang GZIP di pos lainnya.

XZ_OPT=-9 tar -Jcvf file.tar.xz /path/to/directory
David C. Bishop
sumber
2
+1 xz jauh lebih baik daripada bzip2 dan gzip. Berikut ini perbandingan: tukaani.org/lzma/benchmarks.html
User1
8
Pertukarannya adalah kecepatan. XZ secara signifikan lebih lambat.
Bell
32
tar cv /path/to/directory | gzip --best > file.tar.gz

Ini adalah solusi kedua Matrix Mole, tetapi sedikit dipersingkat:

Saat memanggil tar, opsi fmenyatakan bahwa output adalah file. Mengaturnya ke -(stdout) membuat tar menulis outputnya ke stdout yang merupakan perilaku default tanpa keduanya fdan -.

Dan seperti yang dinyatakan oleh gziphalaman manual, jika tidak ada file yang ditentukan gzip akan dikompres dari input standar. Tidak perlu untuk -di gzippanggilan.

Opsi --best(setara dengan -9) menetapkan tingkat kompresi tertinggi.

carlito
sumber
1
Ini bekerja dengan indah. Juga jika Anda menjalankan sebagai root, izin & pemilik juga dipertahankan. Kalau tidak, Anda harus menentukan. Juga jika tidak jelas "-9" adalah kompresi terbaik dan "-1" adalah kompresi tercepat. "-1" masih membutuhkan waktu lama jika Anda memiliki banyak file ;-)
PJ Brunet
Ini bekerja dengan xzdan pixzjuga. Ini adalah cara yang bagus untuk mengontrol jumlah utas yang digunakan untuk kompresi paralel tanpa harus membuat file .tar perantara. Seperti begitutar -cv /path/to/dir | pixz -p4 > output.tpxz
joelostblom
10

Ada juga opsi untuk menentukan program kompresi menggunakan -I. Ini dapat mencakup opsi tingkat kompresi.

tar -I 'gzip -9' -cvf file.tar.gz /path/to/directory
Chris Gibson
sumber
2
Versi tar yang lebih lama seperti yang disediakan dalam CentOS 6 & 7 tidak mendukung memberikan argumen dalam argumen -I, mereka akan mencoba memperlakukan semuanya sebagai nama program untuk exec, dan karenanya gagal. Setidaknya pada tar 1,29 di Debian Stretch, ini berfungsi.
Cheetah
2

Dan tentu saja tar yang diturunkan macOS bsd harus berbeda:

tar -czf file.tar.gz --options gzip:compression-level=9 /path/to/directory
rfay
sumber