मेरे पास लगभग 320116 .pdb.gz फ़ाइलों वाला एक फ़ोल्डर है। मैं उन सभी को अनफ्रेंड करना चाहता हूं। अगर मैं गनज़िप * का उपयोग करता हूं। तो यह मुझे एक त्रुटि देता है अर्थात तर्क सूची बहुत लंबी है। फ़ोल्डर लगभग 2GB है। कृपया मुझे उचित सुझाव दें।
मेरे पास लगभग 320116 .pdb.gz फ़ाइलों वाला एक फ़ोल्डर है। मैं उन सभी को अनफ्रेंड करना चाहता हूं। अगर मैं गनज़िप * का उपयोग करता हूं। तो यह मुझे एक त्रुटि देता है अर्थात तर्क सूची बहुत लंबी है। फ़ोल्डर लगभग 2GB है। कृपया मुझे उचित सुझाव दें।
जवाबों:
find . -name '*.pdb.gz' -exec gunzip {} +
-exec gunzip {} +gunzipअपनी कमांड लाइन पर बहुत सारे लेकिन बहुत सारे फ़ाइल नामों के साथ प्रदान नहीं करेगा । यह अधिक कुशल है -exec gunzip {} \;जिससे gunzipप्रत्येक फ़ाइल के लिए एक नई प्रक्रिया शुरू होती है ।
find, कम gunzip!
find"+" अंकन की अनुमति देते हैं। उदाहरण के लिए देखें,, बीएसडी 10.1 के लिए आदमी पेज । ओएस एक्स (10.9 और बाद में कम से कम, शायद पहले) पर भी लागू होता है। find
जब भी आपको "तर्क सूची बहुत लंबी" त्रुटियां मिलती हैं, तो आप वांछित कमांड को कई बार लागू करके इसके चारों ओर काम कर सकते हैं, हर बार उन तर्कों का एक सबसेट जिसके साथ आप उपयोग करना चाहते हैं। xargsएक उपकरण है जो आपको स्वचालित रूप से ऐसा करने में मदद करता है।
find . -type f -a -name \*.pdb.gz -print0 | xargs -0 gunzip
-execdir gunzip "{}" \;कि xargs प्रत्येक फ़ाइल के लिए अलग से गनज़िप को लागू करेगा? वह मेरा मैन पेज पढ़ना है।
xargsपर फिट होने वाले जितने भी फिल्नामें होंगे वे सब सामान करेंगे gunzip। कोशिश करो! echo a b c d e f | xargs echoकेवल echoसभी 6 तर्कों के साथ एक बार चालान करता है ताकि आपको आउटपुट की एक पंक्ति दिखाई दे (हालांकि निष्पादित करने के लिए बहुत बेकार कमांड !!!!), जबकि यदि आप xargsकेवल कमांड के प्रति आह्वान के लिए 3 तर्क तक आपूर्ति करते हैं, echo a b c d e f | xargs -n 3 echoतो आपको आउटपुट की 2 लाइनें मिलेंगी ।
xargsका एक और लाभ यह है कि, -Pविकल्प के साथ , आप gunzipसमानांतर में कई प्रक्रियाएं चला सकते हैं , जो (आपके सिस्टम के सटीक मापदंडों के आधार पर) तेज हो सकती है।
-P, @psmears। अब मैंने भी कुछ सीखा!
मुझे लगता है कि यह काम करना चाहिए, यह प्रसंस्करण के लिए व्यक्तिगत रूप से गनज़िप के लिए प्रत्येक फ़ाइल का पथ / नाम देता है:
find /my/dir -name "*.pdb.gz" -execdir gunzip "{}" \;
findके साथ +और xargsस्पष्ट रूप से उस मुद्दे को ध्यान में रखते हुए डिजाइनर हैं। ऑपरेटिंग सिस्टम की सीमा से अधिक नहीं होने पर वे हमेशा उतने ही तर्कों की आपूर्ति करेंगे। क्योंकि, वैसे, यह है एक ऑपरेटिंग सिस्टम सीमा, कोई लेना देना नहीं gunzip।
इस तरह आज़माएँ:
find . -name '*.gz' -exec gunzip {} \;
gunzipप्रति फ़ाइल एक बार निष्पादित करेगा । थोड़ा अलग तरीके के लिए जॉन 1024 का जवाब देखें जो उस अक्षमता से बचा जाता है।
यदि आपके पास एक मल्टी-कोर मशीन है, तो आप शायद देखेंगे कि gunzipआपके मशीन की क्षमताओं को अधिकतम करने के लिए उपयोग नहीं किया जा रहा है। इसके लिए आपको gunzipसमानांतर में कई s चलाने की आवश्यकता होगी । ट्रैक रखने के लिए किस टर्मिनल को हाथ से बोझिल किया जाता है, लेकिन आप इसे GNU समानांतर के साथ आसानी से कर सकते हैं:
find . -name "*.gz" | parallel -X gunzip {}
parallelबहुत लंबी है?
findबहुत लंबी है?
findकमांड लाइन पर पास कर रहे हैं ।
-name
इसके लिए उपयोग करना अनावश्यक है find, क्योंकि आपने सबफ़ोल्डर्स का उल्लेख नहीं किया है। आपको क्या करने की आवश्यकता है:
for f in *.gz;do gunzip $f;done
findअगर तुम 320,116 अंडे देने के लिए नहीं करना चाहती gunzipप्रक्रियाओं, इस पाश की तरह करता है।