2011-11-17 6 views
11

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

उदा।

zip -r /new.zip /Unwanted1/Unwanted2/wanted1/wanted2/file.txt 

###unzipped produces the following 
/Unwanted1/Unwanted2/wanted1/wanted2/file.txt 

###I want 
/wanted1/wanted2/file.txt 

अद्यतन: जिस निर्देशिका में मैं ज़िप करना चाहता हूं, उसके पास कई घोंसला वाली निर्देशिकाएं हैं, इसलिए -r। इसके अलावा पूर्ण पथ से निपटना बहुत अच्छा होगा, पुराने समाधान को जगह के बारे में सीडी के लिए इस्तेमाल किया गया था, लेकिन मुझे बस यह पसंद नहीं आया। शायद यह सबसे अच्छा (केवल) तरीका है।

+0

'-r' का अर्थ रिकर्सिव है। यदि आपको वास्तव में इसका उपयोग करने की आवश्यकता है, तो आपको बाहर निकलने के लिए ज़िप विकल्पों पर पढ़ना चाहिए। यदि आप सिर्फ एक फ़ाइल ज़िप करना चाहते हैं, सीडी उचित पेरेंट डीआईआर (आपके उदाहरण के अनुसार) ./Unwanted1/Unwanted2 और फिर 'ज़िप नया। ज़िप चाहता/file.txt'। ऐसा कहने के लिए, मुझे नहीं लगता कि एक ज़िप विकल्प है जिसका अर्थ है 'इनपुट फ़ाइल नाम पर उपनिर्देशिका जानकारी की पहली एन परतों को छोड़ दें'। सौभाग्य। – shellter

+0

आपने बाद में अपना उदाहरण संपादित किया है, जो गेम को उचित मात्रा में बदल देता है। लोग आमतौर पर इस तरह के पूर्ण पथ नहीं चाहते हैं। 'ज़िप' के अंदर और अधिक पथ ट्रिम/नियंत्रण विकल्प हो सकते हैं लेकिन मुझे शक है। मैन पेज पढ़ें। या 'tar' पर स्विच करें और उस (समान रूप से लंबे) मैन पेज को पढ़ें। और आपको अभी भी आवश्यकता नहीं है- अगर आप एक फ़ाइल जोड़ रहे हैं, चाहे कितना गहरा हो। – IcarusNM

उत्तर

16

आपको जहां भी शुरू करना चाहते हैं, वहां निर्देशिकाएं बदलनी होंगी, या हो सकता है कि आपके लिए ऐसा करने के लिए 'ज़िप' करने का विकल्प हो। यदि आप मैन पेज में गैज़िलियन विकल्पों के माध्यम से पढ़ने के लिए बहुत आलसी हैं, जैसे कि मैं हूं, बस 'सीडी' पहले, यहां तक ​​कि एक स्क्रिप्ट में भी। या फिर आप अपने खोल या स्क्रिप्ट की कार्यशील निर्देशिका को प्रभावित किए बिना कोष्ठक में पूरी बात संलग्न कर सकते हैं:

(cd Unwanted1/Unwanted2; zip -r ~/new.zip ./wanted/file.txt) 

या जब से तुम -r का उपयोग कर रहे आप शायद सिर्फ file.txt की तुलना में अधिक चाहते हैं, इसलिए:

(cd Unwanted1/Unwanted2; zip -r ~/new.zip wanted) 

या/बाहर कूद करने के pushd/popd का उपयोग करें:

pushd Unwanted1/Unwanted2 
zip -r ~/new.zip wanted 
popd 

इस श/bash/csh/tcsh में काम करता है।

3

सरल, मुहावरेदार रास्ता:

(cd ./Unwanted1/Unwanted2 && zip -r ../../new.zip ./wanted/file.txt) 

अब, ज़िप टार, rar, केन्द्रीय लोक सूचना अधिकारी और दोस्तों के सभी एक ही प्रबंधन करने के लिए विकल्पों है, लेकिन वे करने के लिए संग्रह उपयोगिता से संस्करण के लिए संस्करण से अलग और निश्चित रूप से कर सकते हैं संग्रह उपयोगिता। मेरा सुझाव है कि आप खोल के साथ काम करने काम करने के लिए जानने के लिए, और आप किसी भी संग्रह प्रारूप आप इच्छा

उपयोग कर सकते हैं एक और तरीका है:

(cd ./Unwanted1/Unwanted2 && find . -name "*.txt" -print) | zip new.zip [email protected] 
+0

जितना अधिक मैं पैरेंट फ़ोल्डर संरचना को छोड़ने के लिए 'ज़िप' में एक ध्वज/विकल्प पसंद करूंगा, ऐसा कोई बेहतर तरीका प्रतीत नहीं होता है। दोनों झंडे '-j' या' -D' ने एक जटिल उप-फ़ोल्डर संरचना पर जो कुछ भी नहीं किया था वह नहीं किया। – paperclip

3

खैर एक सरल तरीका है चारों ओर हो सकता है ऐसा करने के लिए

cd ./Unwanted1/Unwanted2 
zip -r ../../new.zip ./wanted/file.txt 

लेकिन मुझे नहीं पता कि आपकी स्थिति क्या है। शायद आपको मूल निर्देशिका से भागना होगा? इसके अलावा "-r" विकल्प का उपयोग तब किया जाता है जब आप पुनरावर्ती निर्देशिकाओं को पार करना चाहते हैं - आपके द्वारा प्रदान किया गया उदाहरण एक फ़ाइल का उपयोग कर रहा है।

+0

धन्यवाद यह वास्तव में कई निर्देशिकाएं और फ़ाइलें है, उदाहरण v है।सरल –

+0

हाँ, आईस्कस और सीहे की तरह, अगर आप कोष्ठक में कमांड संलग्न करते हैं, तो यह निष्पादित होने के बाद आपकी वर्तमान कार्यशील निर्देशिका को गड़बड़ नहीं करता है। – loosebazooka