मल्टीपल GZip फाइलों का फास्ट कॉन्टैकेनेशन


92

मेरे पास gzip फ़ाइलों की सूची है:

file1.gz
file2.gz
file3.gz

वहाँ एक रास्ता है कि इन फ़ाइलों को एक या एक gzip फ़ाइल में gzip करने के लिए उन्हें विघटित करने के बिना gzipping है?

व्यवहार में हम इसका उपयोग एक वेब डेटाबेस (CGI) में करेंगे। जहां वेब उपयोगकर्ता से एक क्वेरी प्राप्त करेगा और क्वेरी के आधार पर सभी फ़ाइलों को सूचीबद्ध करेगा और उन्हें एक बैच फ़ाइल में उपयोगकर्ता के लिए वापस पेश करेगा।

जवाबों:


107

Gzip फ़ाइलों के साथ, आप बस फ़ाइलों को एक साथ सम्मिलित कर सकते हैं, जैसे:

cat file1.gz file2.gz file3.gz > allfiles.gz

प्रति gzip RFC ,

एक gzip फ़ाइल में "सदस्य" (संपीड़ित डेटा सेट) की एक श्रृंखला होती है। [...] सदस्य फ़ाइल में एक के बाद एक दिखाई देते हैं, पहले कोई अतिरिक्त जानकारी नहीं होती है, उनके बीच या उनके बाद।

ध्यान दें कि यह बिल्कुल समवर्ती डेटा की एकल गज़िप फ़ाइल के निर्माण के समान नहीं है; अन्य बातों के अलावा, सभी मूल फ़ाइल नाम संरक्षित हैं। हालाँकि, गनज़िप इसे एक समवशरण के बराबर के रूप में संभालता है।

चूंकि मौजूदा उपकरण आमतौर पर अतिरिक्त सदस्यों के लिए फ़ाइल नाम हेडर को अनदेखा करते हैं, इसलिए परिणाम से व्यक्तिगत फ़ाइलों को निकालना आसान नहीं है। यदि आप चाहते हैं कि यह संभव हो, तो इसके बजाय एक ज़िप फ़ाइल बनाएँ। ज़िप और GZIP दोनों वास्तविक संपीड़न के लिए DEFLATE एल्गोरिथम का उपयोग करते हैं (ज़िप कुछ अन्य संपीड़न एल्गोरिदम का समर्थन करता है और साथ ही एक विकल्प - विधि 8 वह है जो GZIP के संपीड़न से मेल खाती है); अंतर मेटाडेटा प्रारूप में है। चूंकि मेटाडेटा असम्पीडित है, इसलिए यह सरल है कि वह गज़िप हेडर को बंद कर दे और ज़िप फ़ाइल हेडर और इसके बजाय एक केंद्रीय निर्देशिका निर्देशिका से निपट ले। का संदर्भ लें gzip प्रारूप विनिर्देश और ज़िप प्रारूप विनिर्देश


41
नहीं। बस cat file1.gz file2.gz file3.gz > allfiles.gz। यह वास्तव में इतना आसान है :)
bdonlan

1
तकनीकी रूप से, वे संरक्षित हैं। यह सिर्फ इतना है कि मौजूदा उपकरणों में आम तौर पर उन्हें अलग से निकालने की क्षमता नहीं है। आप एक जिप हेडर और डायरेक्टरी के निर्माण में देखना चाहते हैं, जिप प्रारूप में एक ही अंतर्निहित संपीड़न एल्गोरिदम का उपयोग किया जाता है, इसलिए यह केवल (असम्पीडित) मेटाडेटा को बदलने की बात है। Gzip.org/zlib/rfc-gzip.html (स्रोत प्रारूप) और pkware.com/documents/casestudies/APPNOTE.TXT पर एक नज़र डालें
5

20
Gz फ़ाइलों का ज़िप बनाने से बेहतर है, बस उन्हें फाड़ दिया जाए। यह catउत्तर के समान है लेकिन कुछ अतिरिक्त मेटाडेटा के साथ है। आप बाद में उन्हें मूल फ़ाइल नाम प्राप्त करने के लिए अनटार कर सकते हैं, फिर सभी या बस आवश्यकतानुसार कुछ अनपैक कर सकते हैं।
sorpigal

1
यहाँ कई टिप्पणियाँ .zipफ़ाइलों के बारे में हैं । एल्गोरिथ्म gzip (या bzip2) का उपयोग करके एक संपीड़ित संग्रह में कई फ़ाइलों को एक साथ रखने का मानक तरीका टार का उपयोग कर रहा है: tarफ़ाइलों को एक साथ रखता है (असम्पीडित) और फ़ाइल नाम और विशेषताओं को संरक्षित करता है, gzip का काम परिणाम को संपीड़ित करना है। यह एक -zविकल्प के उपयोग से भी किया जा सकता है tar। परिणामी फ़ाइल एक्सटेंशन .tar.gzया हैं .tgz। मामले में आप पहले से ही संकुचित .gz फ़ाइलों को एक साथ रखना चाहते हैं, बस टार का उपयोग करें। यह कोई और संपीड़न नहीं करता है जो पहले से ही संपीड़ित फ़ाइलों के लिए समझ में आता है।
डैनियल एल्डर

2
@alvas, zcatइसके इनपुट को विघटित करता है, जिससे आपको .gzएक्सटेंशन के साथ विघटित आउटपुट मिलेगा ।
1

51

यहाँ man 1 gzipआपकी आवश्यकता के बारे में क्या कहा गया है।

एकाधिक संपीड़ित फ़ाइलों को संक्षिप्त किया जा सकता है। इस मामले में, गनज़िप एक बार में सभी सदस्यों को निकालेगा। उदाहरण के लिए:

gzip -c file1  > foo.gz
gzip -c file2 >> foo.gz

फिर

gunzip -c foo

के बराबर है

cat file1 file2

कहने की जरूरत नहीं है, file1द्वारा प्रतिस्थापित किया जा सकता है file1.gz

आपको इस पर ध्यान देना चाहिए:

gunzip एक बार में सभी सदस्यों को निकालेगा

इसलिए सभी सदस्यों को व्यक्तिगत रूप से प्राप्त करने के लिए, आपको कुछ अतिरिक्त या लिखना होगा, यदि आप ऐसा करना चाहते हैं।

हालाँकि, इसे मैन पेज में भी संबोधित किया गया है।

यदि आप कई सदस्यों के साथ एक एकल संग्रह फ़ाइल बनाना चाहते हैं ताकि सदस्यों को बाद में स्वतंत्र रूप से निकाला जा सके, तो एक संग्रहकर्ता जैसे कि टार या ज़िप का उपयोग करें। GNU टार -zपारदर्शी रूप से gzip आह्वान करने के विकल्प का समर्थन करता है । गज़िप को टार के पूरक के रूप में डिज़ाइन किया गया है, न कि प्रतिस्थापन के रूप में।


13

बस बिल्ली का उपयोग करें। यह बहुत तेज़ है (मेरे लिए 500 एमबी के लिए 0.2 सेकंड)

cat *gz > final
mv final final.gz

फिर आप यह सुनिश्चित करने के लिए zcat के साथ आउटपुट पढ़ सकते हैं कि यह सुंदर है:

zcat final.gz

मैंने 'gz -c' के दूसरे उत्तर की कोशिश की, लेकिन इनपुट के रूप में पहले से ही gzipped फ़ाइलों का उपयोग करते समय मैं कचरे के साथ समाप्त हो गया (मुझे लगता है कि यह उन्हें डबल संपीड़ित करता है)।

पीवी:

बेहतर है, अगर आपके पास बिल्ली के बजाय 'pv' है:

pv *gz > final
mv final final.gz

यह आपको एक प्रगति बार देता है क्योंकि यह काम करता है, लेकिन बिल्ली के समान काम करता है।


11

आप इन फ़ाइलों की एक टार फ़ाइल बना सकते हैं और फिर नई gzip फ़ाइल बनाने के लिए टार फ़ाइल को gzip कर सकते हैं

tar -cvf newcombined.tar file1.gz file2.gz file3.gz
gzip newcombined.tar

8
वास्तव में आपको नई टार फाइल क्यों चाहिए? यह पहले से ही ज़िपित है (टार के मेटाडेटा के अलावा, जो छोटा होना चाहिए)।
थिटॉन

2
तुम सही हो। फ़ाइल के आकार में बहुत अंतर नहीं होगा, चाहे आप इसे gzip करें या न करें क्योंकि व्यक्तिगत फ़ाइलें पहले से ही gzipped हैं। यह सिर्फ इसलिए है क्योंकि वह तीन व्यक्तिगत फाइलों में से gzip फाइल रखना चाहता था।
द्रोण

1
अतिरिक्त गज़िप बिना किसी लाभ के सामग्री तक पहुँच को धीमा कर देती है। यह मुझे लगता है कि ओपी की आवश्यकता वास्तव में है कि परिणामी संग्रह एक एकल फ़ाइल हो, और यह मानने का कोई कारण नहीं है कि परिणामी फ़ाइल एक gzip फ़ाइल होनी चाहिए।
mc0e
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.