अधिकतम संपीड़न का उपयोग करके TAR के साथ एक निर्देशिका XZ कैसे करें?


115

इसलिए मुझे अधिकतम संपीड़न के साथ एक निर्देशिका को संपीड़ित करने की आवश्यकता है।

मैं इसे कैसे कर सकता हूं xz? मेरा मतलब है कि मुझे tarभी आवश्यकता होगी क्योंकि मैं केवल एक निर्देशिका को संपीड़ित नहीं कर सकता xz। वहाँ एक oneliner उदाहरण के लिए उत्पादन करने के लिए है foo.tar.xz?


11
FWIW, अधिक जानकारी के लिए RTFM का man 1 xzकहना है 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.
साइकोय

जवाबों:


82

xzकमांडलाइन झंडे के मानक सेट का सम्मान करते हुए - संपीड़न स्तर के झंडे सहित, आप कोशिश कर सकते हैं:

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

और यह XZ के साथ अधिकतम संपीड़न स्तर का उपयोग करता है?
लांसबाइन्स

3
-9 को xz में जोड़ने से यह अधिकतम होगा
bsd

23
-9eसबसे अच्छा स्तर है, लेकिन यह बहुत लंबा समय लगेगा
Krzysztof Kraso

-9eहमेशा आपको सबसे अच्छा परिणाम नहीं देगा - बिंदु 8 यहां देखें rootusers.com/13-simple-xz-examples
KolonUK

1
इसके अलावा, यदि आप --threads=0xz
KolonUK

145

tarबैश या व्युत्पन्न खोल पर हाल ही में GNU के साथ :

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

टार के लोअरकेस जे स्विच bzip का उपयोग करता है, अपरकेस J स्विच xz का उपयोग करता है।

XZ_OPTवातावरण चर आप सेट करने देता है xzविकल्प जैसे बुला अनुप्रयोगों के माध्यम से पारित नहीं किया जा सकता है कि tar

यह अब अधिकतम है

man xzअन्य विकल्पों के लिए देखें जिन्हें आप सेट कर सकते हैं ( -e/ कुछ डेटासेट के लिए आपको कुछ अतिरिक्त संपीड़न लाभ दे --extreme सकते हैं)।

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

27
नहीं, तुम नहीं। यह पूरी बात है। आप बस उस मंगलाचरण के लिए पर्यावरण संस्करण सेट कर सकते हैं। यदि आप चाहते हैं, तो आप इसे निर्यात कर सकते हैं, लेकिन आपके पास नहीं है।
bsd

2
आप इसके लिए बैश जैसा खोल मान रहे हैं।
औरदम

7
@anddam, कि बॉर्न परिवार (बॉर्न, ksh, mksh, pdksh, राख, पानी का छींटा, बैश, यश, zsh) और के सभी गोले द्वारा समर्थित है rcऔर akangafish, csh, tcshऔर esप्रमुख गोले है कि यह समर्थन नहीं करते जा रहा है। वहां, आप envकमांड का उपयोग करेंगे ।
स्टीफन चेजलस

1
तो दोनों -9और -exz XZ_OPT=-e9ऑप्स सेट करने के लिए , आप चाहते हैं लेकिन जैसा @krzyk ने बताया, -e बेहद धीमा है
hobs

4
सिर्फ रिकॉर्ड के लिए: XZ_OPTमें लागू एक सुविधा नहीं है tar। इसकी एक विशेषता है xz। जब tarकॉल किया जाता है xz, तो एनवी-चर को बस पास किया जाता है।
स्वेन

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

से भी बेहतर है

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

5
यह कैसे बेहतर है? ई ध्वज क्या करता है?
cxdf

2
option -e, --extremeकम्प्रेशन प्रीसेट (-0 ... -9) को संशोधित करें ताकि कम्प्रेशन या डिकम्प्रेसर (मेमोरी: कंप्रेशर: कम्प्रेशर मेमोरी यूसेज की थोड़ी मात्रा में प्रीसेट -0 के साथ वृद्धि हो सके… -2)। नकारात्मक पक्ष यह है कि संपीड़न समय नाटकीय रूप से बढ़ेगा (यह आसानी से दोगुना हो सकता है)।
एवेंद्रो जूनियर

तो, अगर मैं अपनी मशीन पर लगभग 80GB सॉफ्टवेयर को संकुचित कर रहा हूं (जब मैं चाहता हूं कि सभी कंप्यूटर संसाधन गति के लिए संपीड़न प्रक्रिया में जाएं) मुझे -9नहीं -9e, हाँ का उपयोग करना चाहिए ?
nyxee

1
xz डिफ़ॉल्ट रूप से 1 कोर / थ्रेड का उपयोग करता है, आप इसे जोड़कर अधिकतम कर सकते हैं (गति को बढ़ाएं) -T0, जैसेXZ_OPT="-9e -T0" tar -cJf ...
EkriirkE

10

यदि आपके पास 16 GB RAM (और कुछ नहीं चल रहा है), तो आप कोशिश कर सकते हैं:

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

विघटन के लिए यह 1.5 GiB, और संपीड़न के लिए लगभग 11x की आवश्यकता होगी। स्मृति की कम मात्रा के अनुसार समायोजित करें।

यह केवल मदद मिलेगी अगर डेटा वास्तव में उस बड़ा है, और किसी भी मामले में यह मदद नहीं करेगा कि ज्यादा, लेकिन अभी भी ...

यदि आप बायनेरिज़ को संपीड़ित कर रहे हैं, तो पहले xz विकल्प के रूप में --x86 जोड़ें। यदि आप "मल्टीमीडिया" फ़ाइलों (असम्पीडित ऑडियो या बिटमैप्स) के साथ खेल रहे हैं, तो आप --delta = dist = 2 के साथ प्रयास कर सकते हैं (मूल्य के साथ प्रयोग, कोशिश करने के लिए अच्छे मूल्य 1..4 हैं)।

यदि आप बहुत रोमांच महसूस कर रहे हैं, तो आप अधिक LZMA विकल्पों के साथ खेलने की कोशिश कर सकते हैं, जैसे

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

(ये डिफ़ॉल्ट सेटिंग्स हैं, आप 0 और 4 के बीच मान आज़मा सकते हैं, और lc + lp 4 से अधिक नहीं होना चाहिए)

यह देखने के लिए कि डिफ़ॉल्ट इन मानों के लिए कैसे निर्धारित करता है, आप स्रोत फ़ाइल src / liblzma / lzma / lzma_encoder_presets.c की जाँच कर सकते हैं। हालांकि इसमें बहुत ज्यादा रुचि नहीं है (-ई 273 की अच्छी लंबाई निर्धारित करता है और गहराई को भी समायोजित करता है)।


6

आप विभिन्न विकल्पों की कोशिश कर सकते हैं, मेरे लिए -4 ई बेहतर काम करता है

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

मैंने दौड़कर परीक्षण किया:

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

तो, ऐसा लगता है कि विकल्प -4 ई -9 से थोड़ा बेहतर काम करता है।

$ 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
यह वास्तव में इस सवाल का जवाब नहीं है। यह सिर्फ एक अवलोकन है कि आपके विशेष छोटे डेटा सेट के लिए, -4 ई पहले से ही सबसे अच्छा संपीड़न प्राप्त करता है और इसलिए उच्च स्तर को कोई और अधिक लाभ नहीं मिलता है (और यहां तक ​​कि कभी इतना मामूली जुर्माना)।
psusi

क्या आप Szymon Roziewski के समान उपयोगकर्ता हैं ? यदि हां, तो कृपया कई उत्तर पोस्ट न करें। इसके बजाय, अपने मूल उत्तर को संपादित करें। आप अपना पहला खाता उपयोग नहीं कर सकते हैं तो यहां देखें यहाँ तो अपने खातों को मर्ज करने के लिए के लिए। इस बीच, मैं आपके पिछले उत्तर को हटा रहा हूं और इसे यहां शामिल कर रहा हूं।
terdon

ठीक है, मैंने उस पर एक अधिक व्यापक अध्ययन किया है। मुझे जो मिला वह यहां है। मैंने अपनी हार्डड्राइव से कुछ फाइलें चुनीं और विकल्प -4e और -9e के साथ कम्प्रेशन बनाया। तो, अपने आप से अपना सबसे अच्छा समाधान खोजने के लिए बेहतर है। आप सही थे, कुछ मामलों के लिए -9 बेहतर है, जबकि दूसरे के लिए यह नहीं है: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
सिजोनन रोज्ज़स्की

(टिप्पणियाँ केवल 5 मिनट के लिए संपादित की जा सकती हैं)txt 109 txt/pdf 135
सिजोन रोजविस्की

2
+1। यह ओपी का उपयोग करने वाली फ़ाइलों के लिए अधिकतम संपीड़न निर्धारित करने का एक तरीका खोजने में मदद करता है । 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/    

बाहरी कंप्रेशर्स के साथ भी संपीड़ित करें:

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

बाहरी कंप्रेशर्स decompress:

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

सूची संग्रह बाहरी कम्प्रेसर:

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

1
यह एक कामकाजी उत्तर की तरह लगता है, लेकिन, जैसा कि यह है, इसके स्वरूपण निश्चित होने और विकल्प के स्पष्टीकरण के साथ इसमें बहुत सुधार होगा -I
धग

4

tarआदेश Jxz फ़ाइलों के लिए ध्वज का उपयोग करता है । एक उदाहरण:

tar -cJvf foo.tar.xz foo/


2
Jपहले से ही bdowning के जवाब में उल्लेख किया गया था
Anthon

3

रुचि रखने वालों के -e9लिए, -9एक विशिष्ट लैपटॉप की तुलना में, 0.4% छोटा, संपीड़न पर 20% धीमा, विघटन के लिए 3% धीमा है । यहां टाइमिंग पायथन सोर्स कोड डायरेक्टरी स्ट्रक्चर पर चलती है।

संपीड़न:

$ 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

विसंपीड़न:

$ 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

फाइल का आकार:

$ 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
खराब वैरिएबल नाम चुनना, क्योंकि T0 बहु-थ्रेडेड अभिलेखीकरण को सक्षम करने का विकल्प है।
डेजनली

@ सही ढंग से आप सही हैं! धन्यवाद! उसे बदल दिया।
हॉब्स

2

यह आपके प्रश्न का सटीक उत्तर नहीं है, लेकिन आप दो के बजाय एक कमांड का उपयोग कर सकते हैं:

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

निर्देशिका से सभी फ़ाइलों को जोड़ता है "dir1" संग्रह के लिए संग्रह। आर्क का उपयोग "अल्ट्रासोनिक ettings"

अन्य समर्थित प्रारूप हैं: ज़िप, gzip, bzip2 या टार। इसके लिए बस के 7zबाद बदलें -t
--sourceman 7z

नोट: इस आदेश का उपयोग व्यक्तिगत फ़ाइलों को छोड़कर अपने सिस्टम फ़ाइलों का बैकअप लेने के लिए न करें क्योंकि 7z प्रारूप फाइल सिस्टम अनुमतियों को संग्रहीत नहीं करता है


5
सवाल xz के बारे में था, 7z के बारे में नहीं, भले ही वे दोनों LZMA संपीड़न का उपयोग करते हों।
एमी वैन गेससे

2

Xz-utils के संस्करण v5.2.0 से एक मल्टीकोर मशीन में, जांचें:

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

यदि आप अधिकतम कोर और अधिकतम संपीड़न का उपयोग करना चाहते हैं:

export XZ_DEFAULTS="-9 -T 0 "

या आप उपयोग करना चाहते हैं कोर की संख्या के लिए -T सेट करें।

फिर:

tar cJf target.tar.xz source

संपीड़न स्तर चुनने के लिए भी यह उपयोगी हो सकता है:

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


1

यदि आप एक से अधिक थ्रेड्स का उपयोग करते हुए इसे तेज़ी से पूरा करना चाहते हैं, लेकिन अन्य कार्य करते समय आपके सिस्टम को धीमा किए बिना, यह जोड़ने का प्रयास करें -Tnकि n कितने थ्रेड्स का उपयोग करना चाहते हैं, साथ ही साथ niceकंपाइल को प्राथमिकता को निष्क्रिय करने के लिए उपयोग करें।

मॉडल (4 धागे के लिए):

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

देखने की कोशिश करें topया htopजब आप इसे एक बड़ी निर्देशिका (कई जीबी) में करते हैं। आपको उम्मीद है कि xz19 के सबसे अच्छे मूल्य (सबसे कम प्राथमिकता) के साथ कई धागे देखने चाहिए ।

मैंने यह भी छीन लिया है जैसे कि यह समझदार है, जैसे: -f -अन्य उत्तरों में बस जरूरत नहीं है, क्योंकि tarडिफ़ॉल्ट आउटपुट स्टडआउट है।

आप niceटार प्रक्रिया भी कर सकते हैं, लेकिन मैंने इसे कभी भी आवश्यक नहीं पाया है, क्योंकि xzपाइपलाइन के लिए हमेशा सीपीयू में बाधा आती है।

व्यावहारिक नोट, मैं शायद ही कभी xz -9किसी चीज के लिए उपयोग करता हूं , इतना सीपीयू या समय के कारण नहीं, बल्कि उच्च स्मृति मांगों के कारण। Https://catchchallenger.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZO_vs_LZO#Memory_requirements_on_compression देख लें । xzकंप्रेसर, की तरह bzip2है, लेकिन विपरीत gzip, अधिक स्मृति उच्च संपीड़न कारकों के लिए उपयोग करता है। एक साथ रखें कि xzकिसी भी अन्य कंप्रेसर की तुलना में कहीं अधिक मेमोरी का उपयोग करता है, आप आसानी से 600+ एमबी मेमोरी का उपयोग कर सकते हैं। और यदि आप -Tथ्रेडेड संपीड़न को सक्षम करने के लिए उपयोग करते हैं , तो मेमोरी की मांग और भी बढ़ जाती है। बस कुछ के बारे में पता होना चाहिए, जैसे कि यदि आप 1-2 जीबी मेमोरी के साथ एक छोटी वीएम पर कुछ छोटी सेवा चला रहे हैं, तो आप अनजाने में एक प्रभाव पैदा कर सकते हैं।


1

मैक ओएस एक्स पर, tarएक --options=झंडे का उपयोग करने के लिए पैरामीटर में पास होने के लिए एक वैकल्पिक दृष्टिकोण है । उदाहरण के लिए,

tar Jcvf targetFileName.tar.xz --options='compression-level=9' directoryName
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.