.Tar.gz ile maksimum sıkıştırma nasıl elde edilir? [çift]


63

Bu sorunun zaten burada bir cevabı var:

Tar + gzip 'in kullanımını anlamanın yolu tar, normalde bir dosya grubunu tek bir dosyada birleştirmek gzipiçin kullanılır , daha sonra bu dosyayı sıkıştırmak için kullanılır.

Son zamanlarda bunun tarda sıkıştırabileceğini öğrendim .

Sıkıştırmanın çekirdeğin nasıl çalıştığını tam olarak anlamadığım için, gzip'e önceden sıkıştırılmış bir .tar göndermenin, gzip'in sıkıştırmasına engel olabileceği ve potansiyelinin izin verdiği ve yapabileceği şeyler olduğu konusunda endişeliyim.

Asıl sorum şu: mutlak en küçük tar.gz'yi oluşturmak için hangi args / sıkıştırma yönteminin birleşimini kullanmalıyım ve komut satırı ifadesi bunun için nasıl görünüyor?


2
Zaten sıkıştırılmış dosyaların sıkıştırılması boyutlarını küçültebilir veya arşivi daha büyük hale getirebilir. Hepsi veri tipine ve kullanılan sıkıştırmaya bağlı olarak değişir.
Keltari

@Keltari ne dedi. Sıkıştırma oranları ve oranları, ne sıkıştığınıza bağlıdır, bu nedenle de farklı sıkıştırma algoritmaları ve yöntemleri vardır.
music2myear

Yanıtlar:


111

Veya, tar'a kullanıcıya maksimum sıkıştırma yöntemini şu şekilde söyleyebilirsiniz:

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

Ek olarak, envvar'larınızı dağınıklıktan korumak için şunu yapabilirsiniz:

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

43

Size stated- "gibi olabilir katran da sıkıştırmak -", ima taretmez , her zaman tek başına verileri sıkıştırmak.

Bunu yalnızca zseçenekle kullanıldığında yapar . Bu da kendi başına değil, - - tarzeli verileri gzip ile geçirerek.

Bununla birlikte, bu cevapta belirtildiği gibi , iki komutu yönlendirebilirsiniz: tarve gzipböylece gzipkomutun en küçük çıktı boyutunu elde etmesi için açıkça sıkıştırma düzeyini belirtebilirsiniz .

tar cvf - / yol / dizin / dizin | gzip -9 -> dosya.tar.gz

Burada 9mümkün olan maksimum sıkıştırma seviyesini belirtir.


Özyinelemeli olmadığı bir sorun yaşadım ve komutun bölündüğü için, zaten katranlı varsayılanından bu yana özyinelemeyi nasıl zorlayacağını bulmak zor, zor bir arşiv olacağından şikayet ediyordum. KÖTÜ, yanlış böyle başladığını belirtmiştimtar -cvf /path
Brian Thomas

17

Genellikle ne gzip ne de tar "mutlak en küçük tar.gz" yi yaratamaz. Gz biçiminde sıkıştırabilecek birçok sıkıştırma aracı vardır. Ben bir betik "yazdım gz99 " denemek için gzip, 7zve advdefen küçük dosya almak için. Bunu kullanmak için mümkün olan en küçük dosyayı çalıştırmak üzere:

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

advdefAdvanceCOMP dan yarar genellikle en küçük dosya kalmaz, aynı zamanda arabası (olan gz99bu çıktıyı ait kabul etmeden önce dosya bozuk değil yarar çekler advdef). advdefDoğrudan kullanmak için , ancak istediğiniz gibi file.tar.gz dosyasını oluşturun. O zaman koş:

advdef -z -4 file.tar.gz

Bu, normal olarak gzip ve tar ile okunabilen standart bir gz dosyası oluşturacaktır, sadece biraz daha küçük. Bu, gz formatı ile yapabileceğiniz en iyisidir.

Son zamanlarda tar'ın sıkıştırılabildiğini ve neden en küçük ".tar.gz" dosyasını istediğinizi söylemediğinizden, xz gibi tar dosyalarıyla kullanılabilecek daha verimli formatların olduğunun farkında olmayabilirsiniz. Genel olarak, farklı bir formata geçmek, sıkıştırma işleminde gzip seçenekleriyle uğraşmaktan çok daha iyi bir gelişme sağlayabilir. Xz'nin ana dezavantajı, gzip kadar yaygın olmamasıdır, bu nedenle dosyayı gönderdiğiniz kişilerin yeni bir paket yüklemeleri gerekebilir. Ayrıca, özellikle sıkıştırırken, biraz yavaş olma eğilimindedir. Bu sizin için önemli değilse ve gerçekten en küçük tar dosyasını istiyorsanız, deneyin:

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

Tarunt'un modern versiyonları, örneğin Ubuntu 13.10'da, sıkıştırılmış dosyaları otomatik olarak algılar. Bu nedenle, xz sıkıştırma kullanıyor olsanız bile, yine de her zaman olduğu gibi sıkıştırmasını açabilirsiniz:

 tar xvf file.tar.xz

Bu sıkıştırma araçlarının nasıl karşılaştırılacağı konusunda hızlı bir fikir vermek için, patch-3.1.1'i linux çekirdeğinden sıkıştırmanın etkisini düşünün:

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

Bu önemsiz örnekte, en küçük gz için advdef'e ihtiyacımız olduğunu görüyoruz (7z -tgzip neredeyse bu kadar iyi ve daha az buggy de olsa). Ayrıca, xz'e geçmenin, bize eski gz formatından en iyi şekilde sıkıştırmaya çalışmaktan çok daha fazla alan harcadığını görüyoruz.


OP, bir .tar.gz dosyası için en çok nasıl sıkıştırma elde edileceğini sordu, ancak bir .tar.xz dosyası oluşturmayı önerdiniz. Sizden daha farklı bir soruya cevap veriyorsunuz.
ChrisInEdmonton

Ah, ne için gittiğini anladım. advdef sadece sistemimde çöküyor (v1.15), 'advdef -z -4 file.tar.gz' çalışmıyor, ancak en azından teorik olarak çalıştı. Dosyayı 'gzip -9' işaretinden daha fazla daraltacağına dair kanıt bulamıyorum, ancak olabilir ve her durumda benim -1 oylamamı kaldırmam için yeterli. Aydınlattığın için teşekkürler!
ChrisInEdmonton

Hmm, v1.17 kullanıyorum. Her neyse, içimdeki soylu matematikçi cevabımın tartışmalı olarak teknik olarak doğru olmadığını belirtmek istiyor. Sonuçta, mümkün olan tüm gz dosyalarını en kısadan en uzun zamana kadar numaralandırırsanız ve doğru dosyaya açılan ilk dosyayı seçerseniz, birkaç bayt daha tıraş edebilirsiniz. Fakat pratikte çok yavaş olurdu.
gmatht

"Buggy" ve "arşiv" in birlikte kullanılması gerektiğini sanmıyorum, yozlaşmış bir arşiv ne işe yarar? Sıkıştırma yardımcı programlarını ve farklı türdeki girdi dosyalarını "karşılaştırmak" için çok daha büyük bir dosyaya ihtiyacınız var - ikinci bir farklılığın yüzlerce yüzünde ölçüm yapmak güvenilir değil, sanırım sadece xz -95x gibi bir gz -9zaman alıyor, sadece 1.5x gibi Masanızın önerdiği:
Xen2050

xz işlemini kullanarak lütfen nasıl sıkıştırılmış arşivler oluşturabiliriz?
nyxee 20

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

gzipseçeneği --best(eşdeğer -9) en yüksek sıkıştırma seviyesini sorar.


4
Alternatif olarak, --bestbayrak kullanma : -9 okuyucuya kafa karıştırıcıdır.
om-nom-nom
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.