Bagaimana cara mendapatkan kompresi maksimum dengan .tar.gz? [duplikat]

62

Pertanyaan ini sudah ada jawabannya di sini:

Cara saya memahami penggunaan tar + gzip adalah yang tarbiasanya digunakan untuk mengkonsolidasikan pengelompokan file menjadi satu file, kemudian gzipdigunakan untuk kompres file itu.

Baru-baru ini saya belajar bahwa tarjuga dapat mengompres.

Karena saya tidak sepenuhnya mengerti bagaimana kompresi bekerja pada inti, saya punya (mungkin konyol) kekhawatiran bahwa mengirim .tar pra-kompresi ke gzip dapat mencegah gzip dari kompresi juga karena potensi yang memungkinkan dan hal-hal semacam itu.

Pertanyaan saya pada dasarnya: Kombinasi apa dari metode args / kompresi yang harus saya gunakan untuk membuat tar.gz terkecil absolut, dan seperti apa pernyataan baris perintah untuk itu?

Mario Zigliotto
sumber
2
Mengompresi file yang sudah dikompresi dapat mengurangi ukurannya, atau mungkin membuat arsip lebih besar. Itu semua tergantung pada tipe data dan kompresi apa pun yang digunakan.
Keltari
Apa yang dikatakan @Keltari. Tingkat kompresi dan rasio sangat tergantung pada apa yang Anda kompres, yang juga mengapa ada algoritma dan metode kompresi yang berbeda.
music2myear

Jawaban:

110

Atau, Anda dapat memberi tahu tar untuk kompresi maksimum pengguna dengan cara ini:

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

Selain itu, untuk menjaga agarvvvars Anda tidak berantakan, Anda dapat melakukan ini:

env GZIP=-9 tar cvzf file.tar.gz /path/to/directory
Brian Fane
sumber
43

Seperti yang Anda nyatakan- " tar juga dapat mengompresi ", menyiratkan bahwa - tartidak selalu memampatkan data dengan sendirinya.

Ia melakukannya hanya ketika digunakan dengan zopsi. Itu juga tidak dengan sendirinya, tetapi - dengan melewatkan data tar melalui gzip.

Namun sebagai gantinya, seperti disebutkan dalam jawaban ini , Anda dapat menyalurkan dua perintah: tar& gzipsedemikian rupa sehingga Anda dapat secara eksplisit menentukan tingkat kompresi untuk gzipperintah untuk mencapai ukuran keluaran terkecil.

tar cvf - / path / ke / direktori | gzip -9 -> file.tar.gz

Di sini 9menentukan tingkat kompresi maksimum yang mungkin.

Ujjwal Singh
sumber
Saya punya masalah di mana itu tidak rekursif, dan mengeluh bahwa itu akan menjadi arsip kosong, karena perintah itu dibagi, sulit untuk menemukan cara memaksa rekursif dengan benar, karena sudah tar default. BURUKKU, saya telah salah menentukan mulai dari initar -cvf /path
Brian Thomas
17

Biasanya gzip atau tar tidak dapat membuat "tar.gz terkecil absolut". Ada banyak utilitas kompresi yang dapat memampatkan ke format gz. Saya telah menulis skrip bash " gz99 " untuk mencoba gzip, 7zdan advdefuntuk mendapatkan file terkecil. Untuk menggunakan ini untuk membuat menjalankan file sekecil mungkin:

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

The advdefutilitas dari AdvanceCOMP biasanya memberikan file terkecil, tapi juga kereta (dengan gz99cek utilitas yang belum rusak file sebelum menerima output dari advdef). Untuk menggunakan advdefsecara langsung, buat file.tar.gz namun Anda suka. Lalu lari:

advdef -z -4 file.tar.gz

Ini akan membuat file gz standar yang dapat dibaca oleh gzip dan tar seperti biasa, hanya sedikit lebih kecil. Ini tentang hal terbaik yang dapat Anda lakukan dengan format gz.

Karena Anda baru saja mengetahui bahwa tar dapat mengompres, dan tidak mengatakan mengapa Anda menginginkan file ".tar.gz" terkecil, Anda mungkin tidak menyadari bahwa ada format yang lebih efisien yang dapat digunakan dengan file tar, seperti xz. Secara umum, beralih ke format yang berbeda dapat memberikan peningkatan kompresi yang jauh lebih baik daripada memutar-mutar opsi gzip. Kerugian utama xz adalah bahwa hal itu tidak biasa seperti gzip sehingga orang yang Anda kirimi file mungkin harus menginstal paket baru. Ini juga cenderung sedikit lebih lambat, terutama saat mengompresi. Jika ini tidak masalah bagi Anda, dan Anda benar-benar menginginkan file tar terkecil, coba:

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

Versi tar modern, misalnya di Ubuntu 13.10, secara otomatis mendeteksi file terkompresi. Jadi, bahkan jika Anda menggunakan kompresi xz Anda masih dapat mendekompres seperti biasa:

 tar xvf file.tar.xz

Untuk memberikan gambaran singkat bagaimana perbandingan utilitas kompresi ini, pertimbangkan efek kompresi patch-3.1.1 dari kernel 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

Dalam contoh sepele ini, kita melihat bahwa untuk mendapatkan gz terkecil kita perlu advdef (meskipun 7z -tgzip hampir sama bagusnya dan jauh lebih sedikit buggy). Kita juga melihat bahwa beralih ke xz memberi kita lebih banyak ruang daripada mencoba memeras sebagian besar format gz lama, tanpa kompresi yang terlalu lama.

gmatht
sumber
OP menanyakan cara mendapatkan kompresi paling banyak untuk file .tar.gz, tetapi Anda menyarankan untuk membuat file .tar.xz. Anda menjawab pertanyaan yang berbeda dari yang diajukan.
ChrisInEdmonton
Ah, aku mengerti untuk apa kamu pergi. advdef hanya crash pada sistem saya (v1.15), jadi 'advdef -z -4 file.tar.gz' tidak berfungsi, tetapi setidaknya secara teoritis bisa. Saya tidak dapat menemukan bukti bahwa itu akan menyusutkan file lebih jauh dari 'gzip -9', tetapi mungkin, dan dalam hal apa pun cukup bagi saya untuk menghapus -1 suara saya. Terima kasih telah mengklarifikasi!
ChrisInEdmonton
Hmm, saya menggunakan v1.17. Pokoknya ahli matematika yang bertele-tele dalam diri saya ingin menunjukkan bahwa jawaban saya bisa dibilang tidak benar secara teknis. Lagi pula, jika Anda menghitung semua file gz dari terpendek ke yang terpanjang dan memilih yang pertama yang terekompresi ke file yang tepat, Anda bisa mencukur beberapa byte lagi. Tapi itu terlalu lambat dalam latihan.
gmatht
Saya tidak berpikir "kereta" dan "arsip" harus digunakan bersama, apa gunanya arsip yang korup? Anda memerlukan file yang jauh lebih besar untuk "membandingkan" utilitas kompresi, dan berbagai jenis file input juga - mengukur dalam seperseratus perbedaan kedua tidak begitu dapat diandalkan, saya pikir xz -9biasanya membutuhkan waktu 5x gz -9waktu, bukan hanya 1,5x meja Anda menyarankan.
Xen2050
bagaimana kita bisa membuat arsip terpisah (sambil mengompresi) silakan gunakan proses xz
nyxee
6
tar c /path/to/data | gzip --best > file.tar.gz

gzipopsi --best(setara dengan -9) meminta tingkat kompresi tertinggi.

carlito
sumber
4
Atau, gunakan --bestflag: -9 membingungkan pembaca.
om-nom-nom