मूल निर्देशिका को शामिल किए बिना एक संग्रह को ज़िप करें


30

मैं एक निर्देशिका ट्री में बहुत सारे फ़ोल्डर्स को ज़िप करना चाहता हूं

V-
 something.txt
 folder
 folder
 g.jpg
 h.jar

जब मैं इसे ज़िप करने की कोशिश करता हूं, तो यह v सामग्री के बजाय v फ़ोल्डर के साथ ज़िप संग्रह बनाना समाप्त कर देता है (उप निर्देशिकाएं और फाइलें)

इससे कैसे बचा जा सकता है?

जवाबों:


23

इसलिए अगर मैं सही तरीके से समझूं, तो आप एक विशेष फ़ोल्डर में फ़ाइलों और फ़ोल्डरों को संग्रहीत करने की कोशिश कर रहे हैं, लेकिन रूट फ़ोल्डर को शामिल किए बिना।

उदाहरण:

/test/test.txt
/test/test2.txt

जहां test.txt और test2.txt को ज़िप में संग्रहीत किया जाएगा, लेकिन परीक्षण / परीक्षण नहीं

आप / परीक्षण / निर्देशिका में cd कर सकते हैं, तब कुछ ऐसा चला सकते हैं,

zip -r filename.zip ./*

जो filename.zip नाम के एक ही फोल्डर में एक आर्काइव बनाएगा। या यदि आप इसे उस फ़ोल्डर के बाहर से चला रहे हैं, जिसे आप चला सकते हैं,

zip -r test.zip test/*

/ * वह हिस्सा है जिसमें संपूर्ण फ़ोल्डर के बजाय केवल फ़ोल्डर की सामग्री शामिल है।

संपादित करें: ओपी कई ज़िप चाहता था, समाधान एक हैक के एक बिट होने के नाते समाप्त हो गया, मैं इस बात से उत्सुक हूं कि क्या ऐसा करने का एक बेहतर तरीका है।

for d in */ ; do base=$(basename "$d") ; cd $base ; zip -r $base * ; mv "${base}.zip" .. ; cd .. ; done;

हाँ, लेकिन मेरे पास बहुत सारी फ़ाइल है जो मैं एक ही काम करता हूँ ताकि यह थकाऊ हो जाए जैसे कि यह एक बैश स्क्रिप्ट या कुछ ऐसा है जो निर्देशिका पर उसी प्रक्रिया को स्वचालित करेगा जिसमें सभी फ़ोल्डर्स हैं
Dami

1
ठीक है, मैंने स्क्रिप्ट चलाई और इसने संग्रह में एक मूल निर्देशिका बनाई जिसे मैं केवल फ़ोल्डर की सामग्री को संग्रह में रखना चाहता हूं
Dami

1
मेरी गलती है, इससे थोड़ा चूक गया। जोड़ा गया एक -j पैरामीटर जो मैंने अभी देखा, जाहिरा तौर पर उस भाग को छोड़ देता है जिसे आप नहीं चाहते हैं। इसे आज़माएँ:for d in */ ; do base=$(basename "$d") ; zip -rj "${base}.zip" "$d" ; done;
zzbomb

18
zip -r test.zip test / * बाहर से परीक्षण को जिप फाइल में डायरेक्टरी के रूप में जोड़ता है
smihael

4
जैसा कि @ शमील ने कहा, zip -r test.zip test/*काम नहीं करता। क्या निर्देशिका के बाहर से इसे प्राप्त करने का कोई सही तरीका है?
andrhamm

22

अपने ज़िप कमांड में -jया --junk-pathsविकल्प का उपयोग करें ।

से जिप आदमी पेज :

-j

--junk-paths

Store just the name of a saved file (junk the path), and do not store directory 
names. By default, zip will store the full path (relative to the current 
directory).

यह सही उत्तर प्रतीत होता है।
mutant_city

3
हालांकि नेस्टेड पथ / फ़ोल्डर के बारे में क्या?
ग्यूपैडपॉक

3
यह संग्रह में सभी फ़ोल्डरों को छोड़ देगा, और यदि आपके पास अलग-अलग फ़ोल्डर में डुप्लिकेट फ़ाइल नाम हैं, तो यह उड़ा देगा। यह अपनी जगह है, लेकिन केवल अगर आप फ़ोल्डर्स के बारे में परवाह नहीं करते हैं और बस फाइलें चाहते हैं। नहीं ओपी क्या पूछ रहा था, लेकिन अभी भी अच्छा ज्ञान
गोविंद राय

17

इस आदेश के बारे में कैसे?

$ cd somedir ; zip -r ../zipped.zip . * ; cd ..

5
हालांकि यह एक सही उत्तर है, परिचय ऐसा नहीं लगता जैसे आप स्वयं आश्वस्त होते हैं। यह थोड़ा समझाने में भी मदद करेगा कि कमांड क्या करता है।
नेफांते

1
यह मेरा समाधान भी था, लेकिन मैं इसे नापसंद करता हूं क्योंकि इसमें शामिल है cd। उम्मीद थी कि संग्रहीत मार्ग को अधिक सटीक रूप से निर्दिष्ट करने का एक तरीका था।
nilskp

3

उम्मीद है की यह मदद करेगा।

(cd directory && zip -r ../out.zip .)

यह मुख्य शेल को उसी डायरेक्टरी में रखता है और केवल सब-शेल की डायरेक्टरी को बदलता है जो कमांड के बाद मर जाता है।


मैं इसे @Alfred UC के उत्तर के लिए एक टिप्पणी के रूप में जोड़ना चाहता था, लेकिन मेरे पास इसके लिए पर्याप्त प्रतिष्ठा नहीं है।
केनेथ

यदि यह वास्तव में समस्या को हल करता है, तो यह एक समाधान हो सकता है।
युफेनीयु वेयेह डाइडर

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