ज़िप फ़ाइल में अवांछित पथ से बचें


49

मैं कुछ फ़ाइलों को पैकेज करने के लिए एक शेल स्क्रिप्ट बना रहा हूं। मैं इस तरह एक निर्देशिका जिप कर रहा हूं:

zip -r /Users/me/development/something/out.zip /Users/me/development/something/folder/

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

जब मैं लक्ष्य निर्देशिका के अंदर से ज़िप चलाता हूं, तो मुझे यह समस्या नहीं है।

zip -r out.zip ./folder/

इस मामले में, मुझे सभी कबाड़ नहीं मिले। हालांकि, जहां भी प्रश्न होगा, वहां से स्क्रिप्ट को बुलाया जाएगा।

FWIW, मैं मैक ओएस एक्स 10.6 पर बैश का उपयोग कर रहा हूं।

जवाबों:


85

आपकी स्क्रिप्ट का उपयोग करना चाहिए cdया pushdऔर popdनिर्देशिका है कि संग्रह की जड़ हो जाएगा में जाने के लिए पहले जारी करने के zipआदेश। आप इसे कैसे करते हैं, यह इस बात पर निर्भर करेगा कि स्क्रिप्ट को कैसे पता चलता है कि क्या ऊपर उठाना है। लेकिन, यदि आप / उपयोगकर्ता / मुझे / विकास / कुछ / फ़ोल्डर चाहते हैं, तो बस ./folder के आंतरिक रास्तों के साथ , आपको यह करने की आवश्यकता होगी:

pushd /Users/me/development/something
zip -r /path/to/out.zip ./folder/
popd

इसके परिणामस्वरूप आपके आउट.ज़िप में आपके इच्छित पथ शामिल होंगे।

यदि आपको स्क्रिप्टिंग में सहायता की आवश्यकता है, तो आपको हमें अपनी स्क्रिप्ट दिखाने की आवश्यकता होगी।


8
कोई दिक्कत नहीं है। मैं $ pushd /some/path ; do-something ; popd$ ( cd /some/path ; do-something )
कमांड लाइन

1
@ ~ quack: +1 विशेष रूप से टिप्पणी में उप-शेल तकनीक के लिए।
जोनाथन लेफ़लर

1
हालांकि &&इसके बजाय का उपयोग करना ;एक अच्छा विचार है ताकि cdअसफल होने पर दूसरा कमांड न चले (टाइपो, या अन्य समस्या):(cd /some/path && do-something)
क्रिस जॉन्सन

3
क्या ज़िप फ़ाइल के लिए पूर्ण पथ निर्दिष्ट किए बिना ऐसा करने का कोई तरीका नहीं है?
नारंगी 80

2
आप रास्ते के साथ खेल क्यों खेल रहे हैं? उपयोग क्यों नहीं zip -j?
jww

5

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

हाँ। के -jसाथ विकल्प का उपयोग करें zip-j"जंक द पाथ" है। ज़िप पर मैन पेज के अनुसार :

केवल सहेजे गए फ़ाइल का नाम संग्रहीत करें (पथ रद्दी करें), और निर्देशिका नामों को संग्रहीत न करें। डिफ़ॉल्ट रूप से, ज़िप पूरा पथ (वर्तमान निर्देशिका के सापेक्ष) संग्रहीत करेगा।

-jनिम्नलिखित कमांड का उपयोग करने का अर्थ है:

zip -j myarchive.zip file1.txt dir1/file2.txt dir2/dir3/file3.txt ../file4.txt

एक संग्रह बनाएगा जो दिखता है:

myarchive.zip
    |
    +-- file1.txt
    +-- file2.txt
    +-- file3.txt
    +-- file4.txt

5
क्या यह भी सभी रास्तों को कबाड़ नहीं करता है, यहां तक ​​कि 'फ़ोल्डर' निर्देशिका में भी? मुझे लगता है कि ओपी केवल कमांड लाइन पर रास्ता निकालना चाहता है।
पीटर जरीक

1
यह इस प्रश्न का उत्तर नहीं हो सकता है, लेकिन मुझे इसकी आवश्यकता है।
एरॉन मैकमिलिन

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

1

नहीं है pushdऔर popdऔर $OLDPWD। मान लिया $PWDजाता /Users/me/developmentहै:

pushd something/folder
zip -r $OLDPWD/something/out.zip *
popd

अब $PWDवापस आ गया है/Users/me/development

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