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
?
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
?
Yanıtlar:
xz
Standart komut satırı bayrakları setini kabul edersek - sıkıştırma seviyesi bayrakları dahil, deneyebilirsiniz:
tar -cf - foo/ | xz -9 -c - > foo.tar.xz
-9e
en iyi seviye, ama çok uzun sürecek
--threads=0
tar
Sonunda 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_OPT
Ortam değişkeni ayarladığınız sağlar xz
gibi çağıran uygulamalar yoluyla geçirilemez seçenekleri tar
.
Bu şimdi maksimum .
Bkz man xz
ayarlayabileceğ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
rc
ve akanga
. fish
, csh
, tcsh
Ve es
bunu desteklemez büyük kabukları olmak. Orada, env
komutu kullanırdın .
-9
ve -e
xz seçmesi, istediğiniz XZ_OPT=-e9
ama @krzyk belirttiği gibi, -e olduğu son derece yavaş
XZ_OPT
içinde uygulanan bir özellik değil tar
. Bu bir özellik xz
. Ne zaman tar
aramaları xz
, env-değişken basitçe geçirilir.
XZ_OPT=-9e tar cJf tarfile.tar.xz directory
hatta daha iyi
XZ_OPT=-9 tar cJf tarfile.tar.xz directory
option -e, --extreme
Sı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).
-9
değil -9e
, evet?
XZ_OPT="-9e -T0" tar -cJf ...
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).
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
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
txt 109 txt/pdf 135
tar
xz
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
-I
eklenmesiyle büyük ölçüde geliştirilecekti .
tar
komut, J
xz dosyaları için bayrak kullanır . Bir örnek:
tar -cJvf foo.tar.xz foo/
J
Zaten bdowning cevabı sözü edilen
İlgilenenler -e9
için -9
tipik 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
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 7z
sonra 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 .
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:
Birden fazla iş parçacığı kullanarak daha hızlı bir şekilde tamamlanmasını istiyorsanız, ancak diğer işleri yaparken sisteminizi yavaşlatmadan, -Tn
n'nin kaç tane iş parçacığı kullanacağını, nice
sı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 top
veya htop
bunu büyük bir dizinde (birkaç GB) yaptığınızda deneyin . Umarım xz
Nice 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ü tar
varsayılan çıktı stdout'tur.
Şunları yapabilirsiniz nice
ayrıca katran süreci, ancak ben, bu gerekli bulmadım ettik xz
hep boru hattı için CPU darboğazları.
Pratik not: xz -9
CPU 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 . xz
Kompresör gibi bzip2
, ama farklı olarak gzip
, yüksek sıkıştırma faktörler için daha fazla bellek kullanır. Bununla birlikte, xz
diğer herhangi bir kompresörden çok daha fazla bellek kullandığını, kolayca 600+ MB bellek kullanabileceğinizi söyleyin. -T
Diş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.
man 1 xz
diyorit'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.
.