जिप फाइलों को कैसे मिलाएं / मर्ज करें?


21

पिछले कई महीनों से मैंने साप्ताहिक अंतराल पर फ़ाइलों को ज़िप करने के लिए कई डेटा फ़ोल्डर कॉपी किए हैं। अब मैं उन ज़िप फ़ाइलों को एक ज़िप फ़ाइल में संयोजित करना चाहूंगा, क्योंकि मौजूदा ज़िप फ़ाइलों की अधिकांश सामग्री एक ही डेटा फ़ाइलों के विभिन्न संस्करण हैं।

इसलिए यदि कोई फ़ाइल मौजूदा जिप फ़ाइलों में से एक में दिखाई देती है, तो मैं चाहता हूं कि नया संस्करण नई जिप फ़ाइल में बनाया जाए। बेशक, यदि कोई फ़ाइल केवल एक मौजूदा ज़िप फ़ाइल में दिखाई देती है, तो मैं इसे अंतिम ज़िप फ़ाइल में भी चाहता हूं।

मैं उन्हें एक-एक करके काम करने वाले फोल्डर में अनज़िप करने से बचने की कोशिश कर रहा हूँ, पुरानी ज़िप फ़ाइलों से डेटा को नई ज़िप फ़ाइलों से डेटा के साथ ओवरराइट कर रहा हूँ, और फिर एक नई ज़िप फ़ाइल में सब कुछ रिजेक्ट कर रहा हूँ।

जो मैं समझता हूं कि pkzip ज़िप फ़ाइलों को स्वयं संयोजित करेगा, लेकिन क्या कोई भरोसेमंद और तेज़ मुफ़्त विधि है जो कोई भी मेरे बारे में बता सकता है?


1
जीत के लिए zipmerge
कोड ब्लिंग

जवाबों:


7

आप इसे पसंद नहीं करेंगे लेकिन: सही क्रम में काम करने वाले फ़ोल्डर में सब कुछ खोलना, फिर परिणाम को रोकना सबसे प्रभावी तरीका है।

अन्यथा, आप बहुत सारे बर्बाद सीपीयू चक्रों के साथ समाप्त हो जाएंगे:

  • मान लें कि आपका परिणाम 'First.zip' पर जाता है
  • 2.zip ',' 3.zip 'आदि से हर फाइल को अनज़िप करना पड़ता है और फिर' फ़र्स्ट 'zz' में फिर से ज़िप किया जाता है।
  • '2.zip' में एक फाइल 'foobar.txt' और '3.zip' में एक अन्य फाइल 'foobar.txt' मौजूद है। जिस तरह से आप इसे मर्ज करना चाहते हैं, उसे मर्ज करने से 'एक्स एक्स को कम करना ’होता है।
  • .zip का toc फ़ाइल के अंत में है: आप अधिक सामग्री (बीच में
    किसी फ़ाइल को अद्यतन करके .zip के बीच में) जोड़ते हैं और पूरी फ़ाइल को फिर से लिखना पड़ता है

इसलिए, imho सिर्फ ' अनज़िप ' वारली का उपयोग करें :

% mkdir all
% for x in *.zip ; do unzip -d all -o -u $x ; done
% zip -r all.zip all

अनजिपिंग का क्रम महत्वपूर्ण है, मुझे आपके ज़िप नामों के पैटर्न का पता नहीं है, लेकिन मैं सबसे पहले नई ज़िप फ़ाइल को निकालूंगा, अनज़िप का '-u' विकल्प केवल फाइलों को अधिलेखित करता है यदि वे नए हैं या नहीं तो फाइलें बनाते हैं पहले से ही वहां। नतीजतन, आप केवल नई फ़ाइलों को अनज़िप करेंगे और केवल एक बार परिणाम को ज़िप करेंगे।


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

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

"'2.zip', '3.zip' आदि की प्रत्येक फ़ाइल को अनज़िप करना होगा और फिर 'first.zip' में फिर से ज़िप करना होगा" सही नहीं है। zipmergeउपयोगिता का आपस में विलय decompressing और फिर से संपीड़ित करने, उदाहरण के लिए बिना अभिलेखागार ज़िप।
ZachB

मैंने उपयोग किया unzipping/ zippingऔर नहीं uncompress / decompress। हां, जाहिर है कि कोई भी 2.zip(संपीड़ित बूँद) की एक प्रविष्टि ले सकता है और इसे स्थानांतरित कर सकता है first.zipऔर इस तरह कोई "संपीड़न" नहीं करना पड़ता है। लेकिन आपको 2.zipटीओसी में मौजूदता को देखना होगा first.zip, अगर वहाँ या तो मौजूदा प्रविष्टि को बदल दिया जाए (जिसका अर्थ है कि आपको मूल फ़ाइल को फिर से लिखना होगा) या इसे अंत में संलग्न करें - और उसके बाद आपको इसकी आवश्यकता होगी ज़िप के tocend जोड़ें। मैं नहीं देखता कि zipmergeएक अलग तरीके से ज़िप-प्रविष्टियों के विलय को कैसे प्राप्त किया जा सकता है (एक तरफ संपीड़न)
akira

-1 क्योंकि इस कार्य को करने के लिए और अधिक कुशल तरीके हैं, और इसके लिए कोई भी औचित्य नहीं "सबसे प्रभावी तरीका" थोड़ा सा समझ में आता है। every file [...] has to be unzipped and then zipped again- नहीं, यही आपका समाधान करता है। in '2.zip' exists a file 'foobar.txt' and in '3.zip' exists another file 'foobar.txt'. merging it the way you want to merge it leads to 'compress it X times'- नहीं, यह नहीं है। क्यों होगा? you add more content [...] and the whole file has to be rewritten- नहीं, आप आउटपुट को एक पास में लिखते हैं। किसी ने इसे क्यों उकसाया?
बेन्ज

4

बस ज़िप के -g विकल्प का उपयोग करें, जहां आप किसी भी संख्या में ज़िप फ़ाइलों को एक में जोड़ सकते हैं (पुराने वाले को निकाले बिना)। यह आपको महत्वपूर्ण समय बचाएगा।

इसके अलावा zipmerge पर एक नजर है


4
-gमौजूदा ज़िप में फ़ाइलें जोड़ता है। यह उनका विलय नहीं करता है। जैसे: zip -g result.zip other.zipफ़ाइल other.zipको result.zip में जोड़ देगा - . एक नया बनाने के बजाय निर्दिष्ट ज़िप संग्रह में बढ़ें (जोड़ें)। यदि यह ऑपरेशन विफल हो जाता है, तो आर्क अपने मूल राज्य में संग्रह को पुनर्स्थापित करने का प्रयास करता है। यदि बहाली विफल हो जाती है, तो संग्रह दूषित हो सकता है। यह विकल्प नजरअंदाज कर दिया जाता है जब कोई मौजूदा संग्रह नहीं होता है या जब कम से कम एक संग्रह सदस्य को अद्यतन या हटाया जाना चाहिए।
`

4

यह वह नहीं है जो आप खोज रहे हैं, लेकिन नि: शुल्क चींटी निर्माण उपकरण में जिपफिल्स को मर्ज करने की क्षमता शामिल है।

https://ant.apache.org/manual/Tasks/zip.html


2

https://linux.die.net/man/1/zipmerge :

zipmerge स्रोत ज़िप अभिलेखागार source-zipको लक्ष्य ज़िप संग्रह में मिला देता है target-zip। डिफ़ॉल्ट रूप से, स्रोत ज़िप अभिलेखागार में फाइलें लक्ष्य ज़िप संग्रह में एक ही नाम की मौजूदा फाइलों को अधिलेखित करती हैं।


1

मैं सोच रहा था कि आप फ़ाइलों को एक अस्थायी निर्देशिका में निकाले जा सकते हैं।

इस कमांड लाइन के साथ समस्या है। मुझे अभिलेखागार को हटाने का आदेश देने का कोई तरीका नहीं मिला, इसलिए एक पुराना संग्रह एक नए संग्रह को अधिलेखित कर सकता है। इस समस्या को एक unzipper का उपयोग करके दूर किया जा सकता है एक कमांड लाइन स्विच केवल ओवरराइट करने के लिए यदि नया हो। मैं मुख्य रूप से 7-ज़िप का उपयोग करता हूं जिसमें ऐसा कमांड लाइन विकल्प नहीं है।

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

for /f %f in ('dir /b *.zip') do "c:\program files\7-zip\7z" x %f -oc:\testdir -r -aoa

एक अनज़िपिंग प्रोग्राम का उपयोग करने के लिए इसे बदलने के लिए बस "c:\program files\7-zip\7z" x %f -oc:\testdir -r -aoaप्रत्येक फ़ाइल पर जो भी कमांड निष्पादित करेंगे, उसे बदल दें। %fउस फ़ाइल के नाम के लिए स्थान धारक के रूप में उपयोग करें जिसे आप अनज़िप करना चाहते हैं।

मैंने एक पॉलिश किए गए ऐप की तलाश की, मुफ्त या अन्यथा और वास्तव में एक नहीं मिला।

उम्मीद है कि यह आपको एक अच्छी शुरुआत देगा और WinZip या ऐसा ही कुछ ओवरराइट समस्या का ख्याल रख सकता है।

सौभाग्य।


0

अगर मुझे सही से याद है, तो pkzip एक कमांड-लाइन प्रोग्राम था।

अभी भी ज़िप का कमांड-लाइन संस्करण है जो pkzip के साथ संगत होने का दावा करता है।

इसे इन्फो-ज़िप कहा जाता है और आपके ओएस के लिए एक संस्करण होना चाहिए।


क्या इसकी कार्यक्षमता मेरे बारे में पूछ रही है? मुझे यह नहीं मिल रहा है कि यह इस क्षमता को कहां सूचीबद्ध करता है।
CChriss

1
इन्फो-ज़िप सूट पीकेजिप के साथ फाइल को संगत बनाता है , लेकिन प्रोग्राम खुद ही अलग हैं और मर्ज विकल्प को शामिल नहीं करते हैं।
CarlF

ठीक है, क्षमा करें, मैं कई साल पहले DOMAIN / OS के तहत अपोलो वर्कस्टेशन पर इन्फो-जिप को संकलित और चलाने में सक्षम था। मुझे याद है कि यह डॉस / वीएमएस / यूनिक्स और कुछ अन्य लोगों पर अलग-अलग सुविधाएँ प्रदान करता है, तब भी। मुझे लगता है कि यह और विकसित हो सकता है।
पावियम

0

नेट पर winzip कमांड लाइन के लिए देखें। विनज़िप के पास कमांड लाइन टूल के कई संस्करण हैं जो कि आपके द्वारा इंस्टॉल किए गए विनज़िप के किसी भी संस्करण को फिट करने के लिए हो सकता है। कमांड लाइन टूल WZZIP में एक -f "फ्रेशेन" विकल्प है जो केवल उन्हीं फाइलों को जिप करेगा जो समन आउटपुट जिप फाइल में एक फाइल के नाम से मेल खाते हैं।

ऊपर दिए गए कथन में WZunzip लपेटे हुए का उपयोग करें जैसा कि एक फ़ाइल को एक निर्देशिका में अनज़िप करने के लिए दिखाया गया है, फिर उन फ़ाइलों को आउटपुट योग ज़िप फ़ाइल में जोड़ने के लिए WZzip -f करें। फ़ोर लूप अगली इनपुट फ़ाइल पर काम करने के लिए आउटपुट को एक और केवल समन आउटपुट फ़ाइल पर दोहराता है। इनपुट फ़ाइलों का क्रम कोई फर्क नहीं पड़ता क्योंकि WZzip -f केवल आउटपुट फ़ाइल में जोड़ देगा यदि इनपुट डेटा आउटपुट फ़ाइल में पहले से ही नया है। आउटपुट फ़ाइल में मौजूद सभी फ़ाइलों को भी जोड़ा जाएगा। तब आप परिणाम को एक फ़ोल्डर में अनज़िप कर सकते हैं और फिर एक कुशलता से पैक परिणाम फ़ाइल प्राप्त करने के लिए इसे फिर से ज़िप कर सकते हैं। आप बैच फ़ाइल के अंत में लूप के बाद स्वचालित रूप से भी ऐसा कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.