मैं कमांड लाइन पर कई फ़ाइलों को कैसे ज़िप करूं?


16

इस सबसे बुनियादी प्रश्न को क्षमा करें, लेकिन मुझे स्टैक एक्सचेंज पर कोई प्रत्यक्ष उत्तर या सरल उदाहरण नहीं मिल सकता है।

मान लें कि मेरे पास फ़ाइलों का एक फ़ोल्डर है जिसे मैं एक ज़िप फ़ाइल में संपीड़ित करना चाहूंगा जिसे मैं अपने भयानक विंडोज दोस्तों के साथ साझा कर सकता हूं (अन्यथा मैं सिर्फ उपयोग करूंगा tarऔर इसके साथ किया जा सकता है)। यह इस तरह दिख रहा है:

.
├── file1.txt
├── file2.txt
├── file3.txt
├── file.jpg
└── test.jpg

मैंने मान लिया zipहै:

sudo apt-get install zip

मैं देख रहा हूँ man zipकि यह मुझे एक फ़ाइल सूची का उपयोग करने की अनुमति देता है:

- @ फ़ाइल सूची। यदि एक फ़ाइल सूची के रूप में निर्दिष्ट किया गया है - @ [MacOS पर नहीं], ज़िप कमांड लाइन के बजाय मानक इनपुट से इनपुट फ़ाइलों की सूची लेता है। उदाहरण के लिए,

          zip -@ foo

तो मैंने बनाया zip.lstजो इस तरह दिखता है:

cat zip.lst

file1.txt
file2.txt
file3.txt
file.jpg
test.jpg

और अब मैंने कोशिश की:

zip -@ zip.lst

लेकिन यह कुछ भी नहीं किया सिवाय कंसोल पर एक खाली लाइन बनाने के। और मैं धकेलता रह सकता हूं Enterऔर यह केवल कमांड को निष्पादित किए बिना अधिक रिक्त रेखाएं बनाता रहता है। कुछ खोज के बाद, मुझे एहसास हुआ कि मुझे Ctrl+ दबाकर इनपुट समाप्त करने की आवश्यकता हैD

लेकिन अब मुझे यह त्रुटि मिली:

    zip warning: missing end signature--probably not a zip file (did you
    zip warning: remember to use binary mode when you transferred it?)
    zip warning: (if you are trying to read a damaged archive try -F)

zip error: Zip file structure invalid (zip.lst)

क्या!? मेरी साधारण सूची "वैध फ़ाइल संरचना" कैसे नहीं है? अधिक जानकारी के लिए मैनुअल पर वापस जाएं, और मैं इस पर करीब से नज़र डालता हूं:

यदि एक फ़ाइल सूची के रूप में निर्दिष्ट किया गया है - @ ...

तो मैं इसके बिना कोशिश करता हूं -@, और यह कि कम से कम इसे सही तरीके से संसाधित करने के लिए बिना दबाए Ctrl+ Dलेकिन मैं एक ही त्रुटि के साथ छोड़ रहा हूं ।

सौभाग्य से, मुझे लगभग असंबंधित प्रश्न के उत्तर पर एक टिप्पणी मिली जिसने मुझे एहसास दिलाया कि मुझे ज़िप फ़ाइल को स्पष्ट रूप से नाम देने की आवश्यकता है। यह त्रुटि इसलिए हुई क्योंकि डिफ़ॉल्ट रूप से यह एक ज़िप फ़ाइल बनाने की कोशिश कर रहा था जिसे कहा जाता है zip.lst। लेकिन चूंकि यह मेरी सूची का नाम है, इसलिए कोई सोच सकता है कि यह बस इसे अधिलेखित कर देगा, लेकिन नहीं, यह वास्तव में इसे अपडेट करने की कोशिश कर रहा था। और चूंकि सूची स्पष्ट रूप से ज़िप फ़ाइल नहीं है, इसलिए हमें अमान्य फ़ाइल संरचना त्रुटि मिलती है, और अब यह स्पष्ट है कि यह क्यों कहा गया "शायद ज़िप फ़ाइल नहीं है।" तो फिर मैंने कोशिश की:

zip files.zip zip.lst

adding: zip.lst (deflated 35%)

यूरेका! मैं देख सकता हूं कि ज़िप फ़ाइल बनाई गई थी और मेरे फ़ोल्डर में अब यह है:

.
├── file1.txt
├── file2.txt
├── file3.txt
├── file.jpg
├── files.zip
├── test.jpg
└── zip.lst

लेकिन इससे पहले कि हम जश्न मनाएं, पहले जिप फाइल की सामग्री की पुष्टि करें:

unzip -l files.zip

Archive:  files.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
       48  2016-05-24 15:30   zip.lst
---------                     -------
       48                     1 file

नहीं! ठीक है, वास्तव में यह मानक उपयोग से समझ में आता है क्योंकि यह सिर्फ एक सूची फ़ाइल को छोड़ देता है जो मैंने इसे दिया था। अंत में मैंने फिर से कोशिश की -@लेकिन उसी का परिणाम मिला।

मैं क्या गलत कर रहा हूं?

BTW, मुझे पता है कि मैं GUI का उपयोग कर सकता हूं और इसे अपने माउस के साथ कर सकता हूं, लेकिन मुझे इसकी स्क्रिप्ट करने की आवश्यकता है, और सामान्य तौर पर मैं CLI पर तेज हूं जब मुझे पता है कि मैं क्या कर रहा हूं।

जवाबों:


23

फ़ाइल <पुनर्निर्देशन का उपयोग करें

zip files.zip -@ < zip.lst

या आप सूची और सिर्फ ग्लोब को छोड़ सकते हैं

zip files.zip *.txt *.jpg

धन्यवाद स्टीलधारी

ऐतिहासिक उत्तर

मुझे खुशी है कि मेरे खुद के सवाल का जवाब देना ठीक है क्योंकि मैं अपनी उथल-पुथल को इस उम्मीद में पालना चाहता था कि मेरे आँसू के निशान के पीछे चलने वाले अन्य लोगों को कुछ प्रमुख शब्दों को खोजकर बख्शा जा सकता है।

आखिरकार, मैंने सही उत्तर की खोज की , लेकिन यह गलत प्रश्न के लिए पोस्ट किया गया था ।

स्पष्टता के कुछ बिंदु:

  • मैनुअल एक शाब्दिक सूची को एक फ़ाइल के रूप में संदर्भित नहीं कर रहा है, बल्कि शाब्दिक रूप से फ़ाइलों को कंसोल पर सूचीबद्ध करने के लिए है।
  • यह समझ में आता है कि किसी को यह सोचकर गुमराह किया जा सकता है कि fooफ़ाइल सूची में भेजा गया है, लेकिन यह वास्तव में आउटपुट ज़िप फ़ाइल के नाम का प्रतिनिधित्व करने के लिए है।
  • फ़ाइलों की सूची को उदाहरण में छोड़ा गया है क्योंकि यह -@स्विच का उपयोग कर रहा है , जो इसे प्रदर्शित करता है " कमांड लाइन के बजाय मानक इनपुट से इनपुट फ़ाइलों की सूची लेता है "

इसे समझते हुए, हम अब लक्ष्य को पूरा करने के विभिन्न तरीकों से लैस हैं।

सबसे पहले हमारे द्वारा बनाई गई फ़ाइल सूची का उपयोग करके, हम catज़िप के लिए मानक इनपुट के रूप में एक पाइप के साथ आउटपुट को रीडायरेक्ट कर सकते हैं और रीडायरेक्ट कर सकते हैं :

cat zip.lst | zip -@ files.zip

  adding: file1.txt (stored 0%)
  adding: file2.txt (stored 0%)
  adding: file3.txt (stored 0%)
  adding: file.jpg (stored 0%)
  adding: test.jpg (stored 0%)

यह देखना कि adding: ...प्रत्येक फ़ाइल के लिए निश्चित रूप से एक अच्छा संकेत है, लेकिन हमारी उम्मीदें पहले भी हैं, तो चलिए पुष्टि करते हैं:

unzip -l files.zip

Archive:  files.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2016-05-24 14:54   file1.txt
        0  2016-05-24 14:54   file2.txt
        0  2016-05-24 14:54   file3.txt
        0  2016-05-24 15:00   file.jpg
        0  2016-05-24 14:59   test.jpg
---------                     -------
        0                     5 files

मिठाई! लेकिन वैसे भी कौन जीवन भर उपयोग सूची बनाना चाहता है? यह इस विशेष परिदृश्य को हल करने का एक भयानक दौर है। बेहतर होगा lsकि पाइप से एक सूची प्राप्त करें और ज़िप करें:

ls | zip -@ files.zip

  adding: file1.txt (stored 0%)
  adding: file2.txt (stored 0%)
  adding: file3.txt (stored 0%)
  adding: file.jpg (stored 0%)
  adding: test.jpg (stored 0%)

शानदार! अब आइए grep, उदाहरण के लिए, सिर्फ jpg के जिप को जबरदस्त पावर के साथ फिल्टर बनाते हैं :

ls | grep .jpg | zip -@ images.zip

  adding: file.jpg (stored 0%)
  adding: test.jpg (stored 0%)

या सिर्फ "फाइल" से शुरू होने वाली फाइलें

ls | grep file. | zip -@ files.zip

  adding: file1.txt (stored 0%)
  adding: file2.txt (stored 0%)
  adding: file3.txt (stored 0%)
  adding: file.jpg (stored 0%)

5
उपयोग करने lsऔर grepज़िप के बजाय -@, आप शेल कमांड का उपयोग कर सकते हैं सीधे ज़िप कमांड लाइन पर फ़ाइलों का चयन करने के लिए जैसे zip files.zip file*या zip images.zip *.jpg। इसके अलावा, फ़ाइल से फ़ाइलनामों की सूची का उपयोग करते समय, आप एक अलग बिल्ली प्रक्रिया को लागू करने के बजाय पुनर्निर्देशन का उपयोग कर सकते हैं,zip files.zip -@ < zip.lst
स्टीलड्राइवर

आप फ़ाइलों के साथ नेस्टेड निर्देशिकाओं के साथ यह काम कैसे कर सकते हैं?
बॉलपॉइंटबैन

@ बॉलपॉइंट के findबदले मैं इस्तेमाल करूंगाls
जेफ

6

अधिकतम संपीड़न स्तर के साथ सबसे सरल कमांड

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