मेरे पास लगभग 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
प्रक्रियाओं, इस पाश की तरह करता है।