व्यक्तिगत ज़िप फ़ाइलों में कई निर्देशिकाओं को ज़िप करने की कमान


40

मेरे पास एक एकल निर्देशिका है जिसमें इसके अंदर दर्जनों निर्देशिकाएं हैं।

मैं कमांड लाइन के लिए नया हूं और मैं एक कमांड के साथ आने के लिए संघर्ष कर रहा हूं जो प्रत्येक उप-निर्देशिका को एक अद्वितीय उपनिर्देशिका.ज़िप फ़ाइल में ज़िप करेगा।

तो अंत में मेरी प्राथमिक निर्देशिका मेरे सभी मूल उप-निर्देशिकाओं से भर जाएगी, साथ ही उन .zipफ़ाइलों को भी शामिल किया जाएगा जिनमें प्रत्येक उप-निर्देशिका की सामग्री ज़िपित है।

क्या ऐसा कुछ संभव है? यदि हां, तो कृपया मुझे बताएं कि यह कैसे किया जाता है।


मेरा सुझाव है कि आप देखेंगे कि शेल में "छोरों के लिए" कैसे किया जा सकता है। ऑनलाइनर हैं जो आप कर सकते हैं, लेकिन एक अच्छा लूप बहुत स्पष्ट होगा।
lynxlynxlynx

तो क्या इसका मतलब है कि मुझे एक अलग शेल स्क्रिप्ट लिखने की ज़रूरत है, और फिर कमांड लाइन से उस स्क्रिप्ट को कॉल करें? इस तरह के एक प्राथमिक प्रश्न के लिए क्षमा करें। हालाँकि मुझे कुछ प्रोग्रामिंग का अनुभव है लेकिन यह सामान मेरे लिए नया है।
इवस्टर

जवाबों:


75

आप इस लूप का उपयोग कर सकते हैं bash:

for i in */; do zip -r "${i%/}.zip" "$i"; done

iलूप वेरिएबल का नाम है। */वर्तमान निर्देशिका के प्रत्येक उपनिर्देशिका का अर्थ है, और उन नामों में एक अनुगामी स्लैश शामिल होगा। cdइसे निष्पादित करने से पहले सही जगह पर सुनिश्चित करें। "$i"बस उस निर्देशिका का नाम, जिसमें अनुगामी स्लेश शामिल है। उद्धरण चिह्न यह सुनिश्चित करते हैं कि निर्देशिका नाम में व्हाट्सएप परेशानी का कारण नहीं बनेगा। ${i%/}की तरह है, $iलेकिन हटाए गए स्लैश के साथ, ताकि आप ज़िप फ़ाइल के नाम का निर्माण कर सकें।

यदि आप यह देखना चाहते हैं कि यह कैसे काम करता है, तो echoइससे पहले शामिल करें zipऔर आप निष्पादित के बजाय मुद्रित आदेश देखेंगे।


धन्यवाद यह बहुत अच्छा लग रहा है! हालाँकि एक संभावित समस्या जिसके बारे में मैंने सोचा था: क्या यह अलग-अलग फ़ाइलों में प्रत्येक उप-निर्देशिका के भीतर सभी निर्देशिकाओं को ज़िप करेगा? मैं केवल एकल संपीड़ित फ़ाइलों के रूप में 1-स्तरीय उपनिर्देशिकाओं को ज़िप करना चाहता हूं। मैं 2-स्तर, 3-स्तरीय उप-निर्देशिकाओं आदि के लिए अतिरिक्त ज़िप फाइलें नहीं बनाना चाहता ... कृपया मुझे बताएं कि क्या यह समझ में आता है। एक बार फिर धन्यवाद!
इवस्टर

आप जैसे पहले स्तर के लोगों ने ही अनुरोध किया था।
lynxlynxlynx

*/नाम हर प्रत्यक्ष उपनिर्देशिका, नहीं हर वंशज निर्देशिका। तो आप केवल ऊपरी स्तर के लिए ज़िप प्राप्त करेंगे, जिस तरह से आप उन्हें चाहते हैं। इसके साथ संस्करण echoने उस पहलू को प्रदर्शित किया होगा। प्रत्येक नेस्टेड डायरेक्टरी को अपनी फ़ाइल में जिप करना वास्तव में अधिक काम होगा, और शायद find -type dअन्य ट्रिक्स के बीच उपयोग करके सबसे अच्छा हल किया जाए ।
MvG

1
@fritzmg: मेरे लिनक्स पर एक स्थानीय परीक्षण बताता है कि हाँ, एक डॉट में शुरू होने वाली फाइलें शामिल हैं। यह इंफो-ज़िप टूल की एक संपत्ति होगी, जो मैंने दिए गए कमांड के नहीं, इसलिए आपके zipबाइनरी के आधार पर आप अलग-अलग व्यवहार प्राप्त कर सकते हैं। शीर्ष स्तरीय निर्देशिकाओं के लिए ज़िप फाइलें बनाने के लिए (यानी वर्तमान निर्देशिका के बच्चे) एक डॉट के साथ शुरू करने के लिए, आप shopt -s dotglobग्लोब पैटर्न छिपी हुई फ़ाइलों के साथ-साथ मेल खाने के लिए उपयोग कर सकते हैं ।
MvG

1
एक ज़िप बनाने के लिए जिसकी मूल निर्देशिका इसके मूल के रूप में नहीं है:for i in */; do (cd "$i"; zip -r "../${i%/}.zip" .); done
क्रिस करें
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.