Maksimum sıkıştırma kullanarak TAR dizini nasıl XZ yaparsınız?


116

Bu yüzden bir dizini maksimum sıkıştırma ile sıkıştırmam gerekiyor.

Bunu nasıl yapabilirim xz? Ben de ihtiyacım olacak tarçünkü sadece bir dizini sıkıştıramadım xz. Örneğin üretilecek bir oneliner var mı foo.tar.xz?


11
FWIW, daha fazla bilgi için RTFM man 1 xzdiyor it's not a good idea to blindly use -9 for everything like it often is with gzip(1) and bzip2(1). -7 ... -9 [...] These are useful only when compressing files bigger than 8 MiB, 16 MiB, and 32 MiB, respectively..
cychoi

Yanıtlar:


82

xzStandart komut satırı bayrakları setini kabul edersek - sıkıştırma seviyesi bayrakları dahil, deneyebilirsiniz:

tar -cf - foo/ | xz -9 -c - > foo.tar.xz 

ve bu XZ ile maksimum sıkıştırma seviyesini kullanır?
LanceBaynes,

3
xz'e -9 ekleyerek maksimuma
çıkarır

23
-9een iyi seviye, ama çok uzun sürecek
Krzysztof Krasoń

-9eher zaman en iyi sonucu vermeyecek - burada 8.
maddeye

1
Ayrıca, --threads=0
KolonUK

146

tarSonunda bash veya türetilmiş kabukta GNU ile

XZ_OPT=-9 tar cJf tarfile.tar.xz directory

tar'ın küçük harf j anahtarı bzip, büyük harf J anahtarı xz kullanır.

XZ_OPTOrtam değişkeni ayarladığınız sağlar xzgibi çağıran uygulamalar yoluyla geçirilemez seçenekleri tar.

Bu şimdi maksimum .

Bkz man xzayarlayabileceğiniz diğer seçenekler için ( -e/ --extreme belki bazı veri kümeleri için bazı ek sıkıştırma parası vermek).

XZ_OPT=-e9 tar cJf tarfile.tar.xz directory

27
Hayır yapmazsın. Bütün mesele bu. Sadece bu çağrı için ortamı var olarak ayarlayabilirsiniz. İsterseniz dışa aktarabilirsiniz, ancak yapmak zorunda değilsiniz.
bsd

2
Bunun için bash benzeri bir kabuk sanıyorsun.
anddam

7
@ anddam, bu Bourne ailesinin tüm kabukları (Bourne, ksh, mksh, pdksh, kül, çizgi, bash, yash, zsh) rcve akanga. fish, csh, tcshVe esbunu desteklemez büyük kabukları olmak. Orada, envkomutu kullanırdın .
Stéphane Chazelas,

1
Yani hem ayarlamak -9ve -exz seçmesi, istediğiniz XZ_OPT=-e9ama @krzyk belirttiği gibi, -e olduğu son derece yavaş
ocak

4
Sadece kayıt için: XZ_OPTiçinde uygulanan bir özellik değil tar. Bu bir özellik xz. Ne zaman tararamaları xz, env-değişken basitçe geçirilir.
Sven

14
XZ_OPT=-9e tar cJf tarfile.tar.xz directory

hatta daha iyi

XZ_OPT=-9 tar cJf tarfile.tar.xz directory

5
Bu nasıl daha iyi? E bayrağı ne işe yarar?
cxdf

2
option -e, --extremeSıkıştırma ön ayarını (-0 ... -9) değiştirin, böylece kompresör veya dekompresörün bellek kullanımı arttırılmadan biraz daha iyi sıkıştırma oranı elde edilebilir (istisna: kompresör bellek kullanımı, ön ayarlarla -0 ... -2). Dezavantajı ise sıkıştırma zamanının çarpıcı bir şekilde artacağıdır (kolayca iki katına çıkabilir).
Evandro Jr

Benim makinede Yazılımın 80GB hakkında sıkıştırarak isem Yani, kullanması gereken (i istediğinizde tüm bilgisayarların kaynakları hız için sıkıştırma işlemine gitmek) -9değil -9e, evet?
Nyxee

1
xz varsayılan olarak 1 core / thread kullanır, bunu -T0 ekleyerek maksimuma çıkarabilirsin (hepsini hızlandırabilirsin), örneğinXZ_OPT="-9e -T0" tar -cJf ...
EkriirkE

10

16 GiB RAM’iniz varsa (ve başka hiçbir şey çalışmıyorsa):

tar -cf - foo/ | xz --lzma2=dict=1536Mi,nice=273 -c - > foo.tar.xz 

Bunun, sıkıştırma için 1.5 GiB'ye ve sıkıştırma için yaklaşık 11x'e ihtiyacı olacaktır. Daha az miktarda bellek için buna göre ayarlayın.

Veri aslında o büyük ise bu sadece yardımcı olacak ve her durumda bir işe yaramaz OLDUĞUNU hala çok, ama ...

İkilileri sıkıştırıyorsanız, ilk xz seçeneği olarak --x86 ekleyin. Eğer "multimedya" dosyaları (sıkıştırılmamış ses veya bitmapler) ile oynuyorsanız, --delta = dist = 2 ile deneyebilirsiniz (değer ile deneme, denemek için iyi değerler 1..4).

Kendinizi maceracı hissediyorsanız, daha fazla LZMA seçeneğiyle oynamayı deneyebilirsiniz, örneğin

--lzma2=dict=1536Mi,nice=273,lc=3,lp=0,pb=2

(bunlar varsayılan ayarlardır, 0 ile 4 arasındaki değerleri deneyebilirsiniz ve lc + lp 4'ü geçmemelidir)

Varsayılan ön ayarların bu değerlerle nasıl eşleştiğini görmek için, src / liblzma / lzma / lzma_encoder_presets.c kaynak dosyasını kontrol edebilirsiniz. Orada çok fazla ilgi çeken bir şey yoktur (-e güzel uzunluğu 273'e ayarlar ve ayrıca derinliği ayarlar).


6

Farklı seçenekler deneyebilirsin, benim için -4e daha iyi çalışıyor

tar cf - wam_GG_${dir}.nc | xz -4e > wam_GG_${dir}.nc.tar.xz 

Çalıştırarak test ettim:

$ tar -cf - wam_GG.nc | xz -4e > wam_GG.nc.xz
$ tar -cf - wam_GG.nc | xz -9e > wam_GG.nc.xz.2

Öyleyse, -4e seçeneğinin -9e'den biraz daha iyi çalıştığı görülüyor.

$ ll wam_GG.nc.xz*
-rw-rw-r--. 1 504 504 2707596 Jan 16  2015 wam_GG.nc.xz
-rw-rw-r--. 1 504 504 2708416 Jan 16  2015 wam_GG.nc.xz.2

3
Bu gerçekten soruya cevap vermiyor. Bu sadece sizin özel küçük veri kümeniz için -4e'nin zaten en iyi sıkıştırmayı aldığı ve dolayısıyla daha yüksek seviyelerin daha fazla fayda sağlamadığı (ve hatta çok hafif bir ceza) olduğu bir gözlemdir.
psusi

Szymon Roziewski ile aynı kullanıcı mısınız ? Eğer öyleyse, lütfen birden fazla cevap göndermeyin. Bunun yerine, orijinal cevabınızı düzenleyin. İlk hesabınızı erişemiyorsanız, lütfen bkz burada hesaplarınızı birleştirme nasıl. Bu arada, önceki cevabınızı silip buraya ekliyorum.
terdon

Tamam, bu konuda daha kapsamlı bir çalışma yaptım. Elimde olan şey burada. Sabit sürücümden bazı dosyaları seçtim ve -4e ve -9e seçenekleriyle sıkıştırma yaptım. Bu yüzden, en iyi çözümü kendiniz bulmak daha iyidir. Haklıydın, bazı vakalarda -9e daha iyidir, oysa diğerinde olmaz:no difference = 660 4e better than 9e = 74 9e better than 4e = 17 total files = 751 tar 2 html 2 csv 2 xml 2 gz 2 ppt 2 eps 2 docx 2 gif 2 rpm 3 png 3 asv 3 xlsx 3 exe 3 rar 4 nc 4 txt 5 odt 6 xls 7 zip 7 doc 9 m 12 dat 17 other 109 pdf 133 135 jpg 270
Szymon Roziewski

(yorumlar sadece 5 dakika için düzenlenebilir)txt 109 txt/pdf 135
Szymon Roziewski

2
+1. Bu, OP'nin dosyaları kullanırken ing için maksimum sıkıştırmayı belirlemenin bir yolunu bulmasına yardımcı olur . tarxz
cychoi

5

tar --help : -I, --use-compress-program=PROG

tar -I 'xz -9' -cvf foo.tar.xz foo/  
tar -I 'gzip -9' -cvf foo.tar.gz foo/    

ayrıca harici kompresörler ile sıkıştırın:

tar -I 'lz4 -9' -cvf foo.tar.lz4 foo/
tar -I 'zstd -19' -cvf foo.tar.zst foo/

harici kompresörleri açın:

tar -I lz4 -xvf foo.tar.lz4  
tar -I zstd -xvf foo.tar.zst  

arşiv harici kompresörlerini listele:

tar -I lz4 -tvf foo.tar.lz4
tar -I zstd -tvf foo.tar.zst

1
Bu, çalışan bir cevap gibi gözüküyor, ancak olduğu gibi, biçimlendirmesini sabit hale getirerek ve seçeneklerin -Ieklenmesiyle büyük ölçüde geliştirilecekti .
dhag,

4

tarkomut, Jxz dosyaları için bayrak kullanır . Bir örnek:

tar -cJvf foo.tar.xz foo/


2
JZaten bdowning cevabı sözü edilen
Anthon

3

İlgilenenler -e9için -9tipik bir dizüstü bilgisayar ile karşılaştırıldığında% 0.4 daha küçük, sıkıştırma sırasında% 20 daha yavaş, dekompresyon için% 3 daha yavaş . İşte Python kaynak kodu dizin yapısındaki zamanlama çalışmaları.

Sıkıştırma:

$ Tbefore=`date +%s%3N` && XZ_OPT=-9 tar cJf python3.6.tar.9xz Python-3.6.0 && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"
43.87
$ Tbefore=`date +%s%3N` && XZ_OPT=-e9 tar cJf python3.6.tar.e9xz Python-3.6.0 && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"
53.861

Baskıyı azaltma:

$ Tbefore=`date +%s%3N` && tar xf python3.6.tar.9xz && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"  && rm -rf Python-3.6.0
1.395
$ rm -rf Python-3.6.0
$ Tbefore=`date +%s%3N` && tar xf python3.6.tar.e9xz && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"  && rm -rf Python-3.6.0
1.443

Dosya boyutu:

$ rm -rf Python-3.6.0
$ Tbefore=`date +%s%3N` && tar xf Python-3.6.0.tar.xz && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)" && rm -rf Python-3.6.0
1.49
$ ls -al ?ython*
-rw-rw-r-- 1 hobs hobs 16378500 Dec 23 13:06 python3.6.tar.9xz
-rw-rw-r-- 1 hobs hobs 16314420 Dec 23 13:05 python3.6.tar.e9xz
-rw-rw-r-- 1 hobs hobs 16805836 Dec 23 12:24 Python-3.6.0.tar.xz

1
Hatalı değişken ismi seçiliyor, çünkü T0 çoklu iş parçacıklı arşivlemeyi etkinleştirme seçeneği.
Düzinesi

@Dzenly Haklısın! Teşekkür ederim! Değiştirdi.
Ocak

2

Bu, sorunuza kesin bir cevap değil, iki yerine bir komut kullanabilirsiniz:

7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on archive.7z dir1

"ultras ettings" dizini ile "dir1" dizinindeki tüm dosyaları archive.7z arşivine ekler.

Desteklenen diğer biçimler şunlardır: zip, gzip, bzip2 veya tar. Bunun için sadece 7zsonra değiştirin -t.
--kaynakman 7z

NOT: do not yedeklemek için bu komutu kullanın sistem dosyalarını çünkü kişisel dosyaları hariç 7z biçimi dosya sistemi izinleri saklamaz .


5
Her ikisi de LZMA sıkıştırması kullanmasına rağmen soru, 7z ile ilgili değil, xz ile ilgiliydi.
Amedee Van Gasse,

2

Xz-utils sürüm v5.2.0 olan çok çekirdekli bir makinede, şunları kontrol edin:

-T, --threads=NUM   use at most NUM threads; the default is 1; set to 0

Maksimum çekirdek sayısını ve maksimum sıkıştırmayı kullanmak istiyorsanız:

export XZ_DEFAULTS="-9 -T 0 "

Veya -T'yi kullanmak istediğiniz çekirdek sayısına ayarlayın.

Sonra:

tar cJf target.tar.xz source

Ayrıca bu sıkıştırma seviyesini seçmek için yararlı olabilir:

https://catchchallenger.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO


1

Birden fazla iş parçacığı kullanarak daha hızlı bir şekilde tamamlanmasını istiyorsanız, ancak diğer işleri yaparken sisteminizi yavaşlatmadan, -Tnn'nin kaç tane iş parçacığı kullanacağını, nicesıkıştırmayı boşta önceliğine indirgemeyi eklemeyi deneyin .

Model (4 konu için):

tar c foo/ | nice -n19 xz -9 -T4 > foo.tar.xz

İzlemeyi topveya htopbunu büyük bir dizinde (birkaç GB) yaptığınızda deneyin . Umarım xzNice değeri 19 olan birkaç konu görmelisiniz (en düşük öncelik).

Ben de bunu aşağılamıştım, şöyle mantıklı olabilir: -f -diğer cevaplarda basitçe gerekli değildir, çünkü tarvarsayılan çıktı stdout'tur.

Şunları yapabilirsiniz niceayrıca katran süreci, ancak ben, bu gerekli bulmadım ettik xzhep boru hattı için CPU darboğazları.

Pratik not: xz -9CPU veya zaman nedeniyle değil de yüksek bellek taleplerinden dolayı nadiren bir şey için kullanıyorum . Bir göz atın https://catchchallenger.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO#Memory_requirements_on_compression . xzKompresör gibi bzip2, ama farklı olarak gzip, yüksek sıkıştırma faktörler için daha fazla bellek kullanır. Bununla birlikte, xzdiğer herhangi bir kompresörden çok daha fazla bellek kullandığını, kolayca 600+ MB bellek kullanabileceğinizi söyleyin. -TDişli sıkıştırmayı etkinleştirmek için kullanırsanız, bellek talepleri daha da artar. Farkında olunacak bir şey, örneğin 1-2 GB belleğe sahip küçük bir VM'de küçük bir hizmet kullanıyorsanız, istemeden bir etkiye neden olabilirsiniz.


1

Mac OS X'te, parametreye geçmek için alternatif bir yaklaşım bayrak tarkullanmaktır --options=. Örneğin,

tar Jcvf targetFileName.tar.xz --options='compression-level=9' directoryName
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.