एक ही बार में कई फ़ाइलों को अस्वीकृत करना


27

मेरे पास .zipएक फ़ोल्डर में 200 से अधिक फाइलें हैं। मैं उन लोगों को एक-एक करके विघटित नहीं करना चाहता। मैं सिंगल कमांड या स्क्रिप्ट का उपयोग करने वालों को निकालना चाहता हूं। उसको कैसे करे।

जवाबों:


38

यदि आप वास्तव में उन्हें समानांतर में खोलना चाहते हैं, तो आप कर सकते हैं

for i in *zip; do unzip "$i" & done

हालाँकि, N .zip फ़ाइलों के लिए N प्रक्रियाओं को लॉन्च करेगा और आपके सिस्टम पर बहुत भारी हो सकता है। अधिक नियंत्रित दृष्टिकोण के लिए, एक बार में केवल 10 समानांतर प्रक्रियाओं को शुरू करना, यह प्रयास करें:

find . -name '*.zip' -print0 | xargs -0 -I {} -P 10 unzip {}

लॉन्च की गई समानांतर प्रक्रियाओं की संख्या को नियंत्रित करने के लिए, -Pजो भी आप चाहते हैं उसे बदलें । यदि आप उपनिर्देशिकाओं में पुनरावृत्ति नहीं करना चाहते हैं, तो इसके बजाय यह करें:

find . -maxdepth 1 -name '*.zip' -print0 | xargs -0 -I {} -P 10 unzip {}

वैकल्पिक रूप से, आप टिप्पणियों और चलाने में @OleTange द्वारा सुझाए गए GNU को समानांतर स्थापित कर सकते हैं

parallel unzip ::: *zip

3
समानांतर में चलना एक अच्छा विचार है, लेकिन डिस्क I / O प्रमुख अड़चन नहीं होगी?
धान लैंडौ

1
@PaddyLandau यकीन नहीं है, मुझे जाँच करनी होगी। यह विघटन एल्गोरिथ्म बनाम मेरी कल्पना की डिस्क की गति पर निर्भर करेगा।
टेराडन

का उपयोग करें -execया -execdirपाइपिंग के बजाय xargs। न केवल यह समझना आसान है, बल्कि यह कम त्रुटि वाला भी है और कम सिस्टम संसाधनों का उपयोग करता है। find . -name '*.zip' -exec unzip {} ';'(आपको अर्ध-उपनिवेश का उद्धरण देना होगा।)
धान्डु लांडौ

@PaddyLandau केवल एक ही कारण है कि मैं xargs को पाइप कर रहा हूं, समानांतर में चीजों को चलाने के लिए है जैसा कि ओपी ने पूछा है। -exec \;(आप अर्धविराम से बच सकते हैं, उद्धरण की कोई आवश्यकता नहीं है), प्रत्येक कमांड क्रमिक रूप से चलेगा। -exec +बेहतर है, लेकिन यह यहाँ काम नहीं करेगा क्योंकि यह unzipकाम नहीं करता है।
टेराडॉन

मुझे लगता है कि हमने ओपी को अलग तरह से समझा है। आप उसे समानांतर रूप में चाहते हुए पढ़ते हैं, जबकि मैंने उसे कई आदेशों के बजाय एक ही अर्थ समझा। खैर, उनके पास अब दोनों तरीके हैं :)
धान लांडौ

17

जीएनयू समानांतर आदेश में अच्छी तरह से बात के इस प्रकार के लिए उपयुक्त है। बाद:

$ sudo apt-get install parallel

फिर

ls *.zip | parallel unzip

यह आपके पास जितने कोर का उपयोग करेगा, प्रत्येक कोर को एक अनज़िप के साथ व्यस्त रखेगा, जब तक कि वे सभी काम न करें।


echo *.zipअतिरिक्त जानकारी में एक संभावित एलिस उर्फ ​​को रोकने के बजाय इसका उपयोग करना बेहतर विचार है । हालाँकि, यह @ गुरु के उत्तर के समान ही है, यह व्हॉट्सएप युक्त फ़ाइल नामों पर टूटता है।
nyuszika7h

1
@ nyuszika7h xargsGNU समानांतर के विपरीत अंतरिक्ष / टैब / उद्धरण वाले फ़ाइल नामों पर नहीं टूटता है। केवल अगर फ़ाइल नाम में नई सुर्खियाँ हैं तो आपको अतिरिक्त देखभाल करनी होगी। उदाहरण के लिए उपयोग करके:parallel unzip ::: *.zip
Ole Tange

@ nyuszika7h - ये दोनों अलियासिंग स्टैण्डर्ड कमांड्स से बचने के लिए , और फ़ाइलनाम में स्पेस देने के अच्छे कारण हैं ।
वेन कॉनराड

@ nyuszika7h का उपयोग echoकरना उतना ही बुरा है जितना उपयोग करना ls। ग्लोबिंग और थोड़ी देर का लूप सबसे सुरक्षित है।
टेराडन

1
@NateEldredge जब सिस्टम केवल एक चुंबकीय डिस्क था उस समय में वापस बड़ा था, इन दिनों एकाधिक स्पिंडल और फ्लैश डिस्क के साथ RAID के साथ कि मौका छोटा है। सबसे अच्छी बात यह है कि आपके सिस्टम का व्यवहार कैसा है, इसे मापें और देखें । मैंने हाल ही में एक 40 स्पिंडल RAID का उपयोग किया है जहां I / O भूख प्रक्रियाओं के लिए इष्टतम समानता 10 थी: इसने 10x की गति नहीं दी - केवल 6x, लेकिन 10 से कम प्रक्रियाओं ने 6x से कम दिया।
ओले तांगे

12

आप निम्न आदेश का उपयोग कर सकते हैं:

टर्मिनल में निर्देशिका को पहले बदलें जिसमें .zip फाइलें हों:

cd /path

फिर इस आदेश को सभी .zip फ़ाइलों को अनज़िप करने के लिए निष्पादित करें:

for z in *.zip; do unzip "$z"; done

10

यदि .zipआपके फ़ोल्डर में कई फाइलें हैं और आप उन सभी को हटाना चाहते हैं तो टर्मिनल खोलें और उपयोग करके अपने फ़ोल्डर में जाएं:

cd <path_to_folder>

अब इस कमांड का प्रयोग अपनी सभी .zipफाइल को डिकम्प्रेस करने के लिए करें :

ls *.zip | xargs -n1 unzip

3
यह विफल हो जाएगा अगर किसी भी फ़ाइल नाम में व्हॉट्सएप हो।
टेराडॉन

1
हाँ आप सही हैं।
g_p

इसके echo *.zipबजाय एक संभव विचार का उपयोग करने के लिए lsअतिरिक्त जानकारी को चुपके से रोकने के लिए उपयोग करना बेहतर है , हालांकि यह अभी भी व्हाट्सएप समस्या को ठीक नहीं करता है।
nyuszika7h

1
@OleTange यदि आपने ध्यान नहीं दिया है, तो मैंने कहा कि यह अभी भी उनमें व्हाट्सएप के साथ फाइल नामों पर विफल है।
nyuszika7h 15

1
lsस्क्रिप्ट के लिए आउटपुट पर कभी भी निर्भर न करें , क्योंकि इसका आउटपुट संस्करणों के बीच अच्छी तरह से परिभाषित नहीं है। इसके बजाय @terdon से उत्तर देखें क्योंकि यह इस समाधान की सभी समस्याओं को हल करता है।
धान लैंडौ

6

आप इस -execतरह से पा सकते हैं ,

find . -name "*.zip" -exec unzip {} \;

यह काम करेगा अगर फ़ाइल के नाम में जगह है।


3

एक गैर टर्मिनल विधि।

बस ज़िप फ़ाइलों का चयन करें, एक पर राइट क्लिक करें और चुनें extract here। आप एक बार में सभी या बस कई ज़िप फ़ाइलों का चयन कर सकते हैं।


1

unzip \*.zip या unzip '*.zip'

स्पष्ट unzip *.zipकाम नहीं करता है, क्योंकि शेल इसका विस्तार करता है unzip foo.zip bar.zip ...और unzipज़िप फ़ाइल के रूप में पहले फ़ाइल नाम की व्याख्या करता है, और निम्न फ़ाइल का नाम उस ज़िप फ़ाइल से निकालने के लिए फ़ाइलों के रूप में होता है।

हालांकि, unzipयूनिक्स कमांड्स के बीच यह थोड़ा असामान्य है कि यह अपने स्वयं के ग्लोब विस्तार करता है। यदि *शेल द्वारा विस्तार नहीं किया गया है, तो unzip इसे करेगा, और सभी परिणामी फ़ाइलनामों को जिप फ़ाइलों के रूप में संसाधित करने के लिए अलग करेगा। तो इस विशेष मामले में, एक forलूप xargsया इस तरह से दूर हो सकता है ।

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