इस सबसे बुनियादी प्रश्न को क्षमा करें, लेकिन मुझे स्टैक एक्सचेंज पर कोई प्रत्यक्ष उत्तर या सरल उदाहरण नहीं मिल सकता है।
मान लें कि मेरे पास फ़ाइलों का एक फ़ोल्डर है जिसे मैं एक ज़िप फ़ाइल में संपीड़ित करना चाहूंगा जिसे मैं अपने भयानक विंडोज दोस्तों के साथ साझा कर सकता हूं (अन्यथा मैं सिर्फ उपयोग करूंगा 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 पर तेज हूं जब मुझे पता है कि मैं क्या कर रहा हूं।
ls
औरgrep
ज़िप के बजाय-@
, आप शेल कमांड का उपयोग कर सकते हैं सीधे ज़िप कमांड लाइन पर फ़ाइलों का चयन करने के लिए जैसेzip files.zip file*
याzip images.zip *.jpg
। इसके अलावा, फ़ाइल से फ़ाइलनामों की सूची का उपयोग करते समय, आप एक अलग बिल्ली प्रक्रिया को लागू करने के बजाय पुनर्निर्देशन का उपयोग कर सकते हैं,zip files.zip -@ < zip.lst