मुझे कई संपीड़ित फ़ाइलों को एक संग्रह में कैसे संयोजित करना चाहिए?


10

मेरे पास कुछ सौ .tar.xzफाइलें हैं जो लगभग समान हैं (वे दैनिक डेटाबेस डंप हैं, और डेटाबेस धीरे-धीरे बदलता है)।

मेरा मानना ​​है कि असम्पीडित फ़ाइलों में समानता के कारण, वे बहुत अच्छी तरह से संपीड़ित करेंगे, और छोटे पैमाने पर परीक्षणों से पता चला है कि इन असम्पीडित फ़ाइलों में से किसी भी संख्या को संपीड़ित करने से उनमें से एक से थोड़ा ही बड़ा एक संग्रह बनता है।

मेरी समस्या यह है कि सभी असम्पीडित फ़ाइलें कुछ टेराबाइट्स होंगी (संपीड़न अनुपात लगभग 25: 1 है), और मेरे पास कार्य क्षेत्र के रूप में उपयोग करने के लिए इतना डिस्क स्थान नहीं है।

क्या कोई ऐसा तरीका है जिससे मैं एक समय में व्यक्तिगत संपीड़ित फ़ाइलों को संसाधित कर सकता हूं, उन्हें एक एकल संग्रह में जोड़ सकता हूं और उन्हें एक साथ संपीड़ित करने के लाभों को बनाए रख सकता हूं?


क्या आपने इसे स्क्रिप्ट करने की कोशिश की है, ताकि आप एक फ़ाइल को अनकैप करें, किसी दिए गए संग्रह में सभी फ़ाइलों को जोड़ दें और फिर अगले पर जाएं?
दारनिर

जवाबों:


10

चूंकि टार फाइलें एक स्ट्रीमिंग प्रारूप हैं - आप catउनमें से दो को एक साथ कर सकते हैं और लगभग सही परिणाम प्राप्त कर सकते हैं - ऐसा करने के लिए आपको उन्हें डिस्क पर निकालने की आवश्यकता नहीं है। आप फ़ाइलों को केवल हटा सकते हैं, उन्हें एक साथ सम्मिलित कर सकते हैं, और उस स्ट्रीम को पुनः प्राप्त कर सकते हैं:

xzcat *.tar.xz | xz -c > combined.tar.xz

combined.tar.xzघटक में सभी फ़ाइलों का एक संकुचित टारबॉल होगा जो केवल थोड़ा भ्रष्ट है। निकालने के लिए, आपको --ignore-zerosविकल्प (जीएनयू में tar) का उपयोग करना होगा , क्योंकि अभिलेखागार में एक "एंड-ऑफ-फ़ाइल" मार्कर है जो परिणाम के बीच में दिखाई देगा। हालांकि, इसके अलावा, सब कुछ सही ढंग से काम करेगा।

जीएनयू संयुक्त अभिलेखागार के उत्पादन के लिए tarएक --concatenateमोड का भी समर्थन करता है । ऊपर जैसी ही सीमाएँ हैं - आपको --ignore-zerosनिकालने के लिए उपयोग करना होगा - लेकिन यह संपीड़ित अभिलेखागार के साथ काम नहीं करता है। आप प्रक्रिया प्रतिस्थापन के उपयोग से इसे काम में लाने के लिए कुछ बना सकते हैं, लेकिन यह एक परेशानी है और इससे भी अधिक नाजुक है।

यदि ऐसी फाइलें हैं जो अलग-अलग टार फ़ाइलों में एक से अधिक बार दिखाई देती हैं, तो यह ठीक से काम नहीं करेगी, लेकिन आपको उस समस्या की परवाह किए बिना मिला है। अन्यथा यह आपको वह देगा जो आप चाहते हैं - आउटपुट को पाइपिंग के माध्यम xzसे tarवैसे भी इसके आउटपुट को कैसे संपीड़ित करता है।


यदि अभिलेखागार जो केवल एक विशेष tarकार्यान्वयन के साथ काम करते हैं, तो आपके उद्देश्यों के लिए पर्याप्त नहीं हैं, rआपके मित्र के साथ संग्रह में संलग्न हैं :

tar cJf combined.tar.xz dummy-file
for x in db-*.tar.xz
do
    mkdir tmp
    pushd tmp
    tar xJf "../$x"
    tar rJf ../combined.tar.xz .
    popd
    rm -r tmp
done

यह केवल एक समय में एक एकल संग्रह को निकालता है, इसलिए कार्य स्थान एकल संग्रह की सामग्री के आकार तक सीमित है। संपीड़न सिर्फ इस तरह से स्ट्रीमिंग कर रहा है जैसे कि आपने अंतिम संग्रह को एक ही बार में बनाया होगा, इसलिए यह उतना ही अच्छा होगा जितना कि यह कभी भी हो सकता है। आप बहुत अधिक अपघटन और पुनर्संयोजन करते हैं जो catसंस्करणों की तुलना में यह धीमा कर देगा , लेकिन परिणामी संग्रह बिना किसी विशेष समर्थन के कहीं भी काम करेगा।

ध्यान दें कि - आप वास्तव में क्या चाहते हैं इसके आधार पर - सिर्फ एक संग्रह में असम्पीडित टार फ़ाइलों को जोड़ने से पर्याप्त हो सकता है। वे (लगभग) एक ही फाइल में उनकी सामग्री के साथ ही लगभग सेक करेंगे, और यह प्रत्येक फ़ाइल के लिए संपीड़न ओवरहेड को कम करेगा। यह कुछ इस तरह दिखेगा:

tar cJf combined.tar.xz dummy-file
for x in db-*.tar.xz
do
    xz -dk "$x"
    tar rJf combined.tar.xz "${x%.xz}"
    rm -f "${x%.xz}"
done

यह अंतिम संपीड़ित आकार के मामले में थोड़ा कम कुशल है क्योंकि धारा में अतिरिक्त टार हेडर हैं, लेकिन फ़ाइलों के रूप में सभी फाइलों को निकालने और फिर से जोड़ने पर कुछ समय बचाता है। आप combined.tar.xzकई (असम्पीडित) db-*.tarफ़ाइलों के साथ समाप्त होगा ।


धन्यवाद, आपका दूसरा विकल्प मेरे उद्देश्य के लिए सही लगता है, लेकिन क्या आप अपने अंतिम पैराग्राफ पर विस्तार से बता सकते हैं? यह कैसा दिखेगा?
jL6

@ jl6: संपादन देखें
माइकल होमर

क्षमा करें, केवल यह परीक्षण करने में सक्षम है। आपका दूसरा तरीका मुझे यह त्रुटि देता है:tar: Cannot update compressed archives
jl6
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.