Tar -zcvf kullanılırken sıkıştırma seviyesi nasıl belirlenir?


142

İşyerinde çok sık dizinleri alıyorum. Normalde yaptığım şey

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

Burada sıkıştırma seviyesini belirtmenin bir yolu var mı? Sıkıştırmak daha uzun sürse bile mümkün olan en iyi sıkıştırmayı kullanmak istiyorum.

Yanıtlar:


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

bash kullandığınızı varsayarsak. Genellikle, GZIP ortam değişkenini "-9" olarak ayarlayın ve tar'ı normal şekilde çalıştırın.

Ayrıca - gerçekten en iyi sıkıştırmayı istiyorsanız, gzip kullanmayın. Lzma veya 7z kullanın.

Ve gzip kullanırken (zaten çeşitli nedenlerden dolayı iyi bir fikirdir) pigzprogramı kullanmayı düşünmeyin gzip.


14
pigz, gzip sıkıştırması için tüm çekirdeklerinizi kullanan "paralel gzip" dir. top200% -400 $ CPU arasında herhangi bir yeri kullanarak izleyebilir ve görebilirsiniz.
Felipe Alvarez

2
FYI, .bz2 formatı için şunları kullanın: BZIP2 = -9 tar cvjf file.tar.bz2 / yol / dizin / dizin
Tomofumi

3
Çevre değişkeni şimdi görünüyor GZIP_OPT, kullanım aynı olmalı.
Seer

3
Gzip için Ubuntu 16.04'teki man sayfasından: "Vax / VMS'de, programın çağrılması için ayarlanan sembolle bir çakışmayı önlemek için ortam değişkeninin adı GZIP_OPT'dur." Sh, csh ve MSDOS için hala sadece GZIP olmalı
Ponyboy47

68

Tar için gzip bayrağını kullanmak yerine, tar işleminden sonra dosyaları elle gzipleyin, ardından gzip programı için sıkıştırma seviyesini belirleyebilirsiniz:

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

Veya kullanabilirsiniz:

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

Gzip komut satırındaki -9, gzip'e maksimum sıkıştırma düzeyini kullanmalarını söyler (varsayılan değer -6'dır).

Düzenleme: @depesz yorumlarına dayanarak sabit boru komut satırı.


4
Borular kullanılarak aşağıdakiler yapılmalıdır:tar cvf - /path/to/directory | gzip -9 - > file.tar.gz

1
1 örnek bitmelidir file.tarberi gzip".gz" uzantısı ekler.
bonsaiviking

4
neden atlamayın f -? dosya yoksa, o zaman stdin / out
akostadinov 19:13

previos yorumuna ek olarak. "Man tar" bölümünden Çevre: TAPE --file belirtilmemişse arşiv için kullanılacak aygıt veya dosya. Bu ortam değişkeni ayarlanmamışsa, bunun yerine stdin veya stdout kullanın.
Mikl

2
ve "gzip -9 -" -> "gzip -9" 'u azaltabiliriz. "Man gzip" bölümünden Açıklama: Dosya belirtilmemişse veya bir dosya adı "-" ise, standart girdi standart çıktıya sıkıştırılır.
Mikl

53

Tar'ın modern versiyonları xz arşiv formatını destekler (GNU tar, 2009'da 1.22 , 2010'da 1.17.0'dan beri Busybox ).

Bu dayanıyor lzma2 tür bir gibi 7-Zip sürümünü gz . Bu, xz desteğine gereksinim duyma zorunluluğunuz varsa, daha iyi bir sıkıştırma sağlar.

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

Ben sadece burada (temelde bu sorunun bir dupe, ama Unix stackexchange) diğer yazıdaki GZIP bir benzer XZ sıkıştırma seviyesini kontrol etmek için bir XZ_OPT = -9 ortam değişkeni olduğunu öğrendim.

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

2
+1 xz, hem bzip2'den hem de gzip'ten çok daha iyidir. İşte bir karşılaştırma: tukaani.org/lzma/benchmarks.html
Kullanıcı1

8
Değişim hızdır. XZ önemli ölçüde yavaşlar.
Bell,

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

Bu Matrix Mole'un ikinci çözümü, ancak biraz kısaltılmış:

Tar çağırırken, seçenek fçıktının bir dosya olduğunu belirtir. Bunu Ayar -(stdout'ta) katran hem olmadan varsayılan davranıştır standart çıktıya çıktı gönderme yapar fve -.

gzipMan sayfası tarafından belirtildiği gibi , eğer hiçbir dosya belirtilmezse, gzip standart girişten sıkıştırılır. Gerek yoktur -içinde gzipçağrı.

Option --best(eşdeğerde -9) en yüksek sıkıştırma seviyesini ayarlar.


1
Bu güzel çalışıyor. Ayrıca root olarak çalıştırıyorsanız, izinler ve sahipler de korunur. Aksi takdirde belirtmeniz gerekir. Ayrıca açık değilse "-9" en iyi sıkıştırma ve "-1" en hızlı sıkıştırmadır. Çok fazla dosya varsa "-1" hala uzun bir zaman alır ;-)
PJ Brunet

Bu xzve pixzçok çalışır . Bir ara .tar dosyası oluşturmak zorunda kalmadan paralel sıkıştırma için kullanılan diş sayısını kontrol etmek için harika bir yoldur. Öyletar -cv /path/to/dir | pixz -p4 > output.tpxz
joelostblom

10

-I kullanarak sıkıştırma programını belirleme seçeneği de vardır. Bu, sıkıştırma seviyesi seçeneğini içerebilir.

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

2
CentOS 6 & 7'de verilen gibi eski tar sürümleri, argümanda argüman sunmayı desteklemez -I, her şeyi yürütmek için bir program adı olarak ele almaya çalışırlar ve bu nedenle başarısız olurlar. En azından Debian Stretch'deki tar 1.29'dan itibaren, bu işe yarıyor.
Çita

2

Ve tabii ki macOS bsd türetilmiş katranın farklı olması gerekir:

tar -czf file.tar.gz --options gzip:compression-level=9 /path/to/directory
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.