एक फ़ोल्डर में निहित .gz फ़ाइलों को निकालना


13

मेरे पास लगभग 320116 .pdb.gz फ़ाइलों वाला एक फ़ोल्डर है। मैं उन सभी को अनफ्रेंड करना चाहता हूं। अगर मैं गनज़िप * का उपयोग करता हूं। तो यह मुझे एक त्रुटि देता है अर्थात तर्क सूची बहुत लंबी है। फ़ोल्डर लगभग 2GB है। कृपया मुझे उचित सुझाव दें।


यदि आपको लंबे समय तक इस निर्देशिका संरचना पर काम करना होगा, तो इस निर्देशिका को कई लोगों में विभाजित करें। उदाहरण के लिए फ़ाइलों के संशोधन के समय पर या फ़ाइलों के नाम पर।
दान

हां मुझे लॉन्ग टर्म पर काम करना होगा। वे अब निकाले गए हैं मैं उनके नाम के आधार पर उन्हें तीन फ़ोल्डरों में विभाजित करना और वर्गीकृत करना चाहता हूं। क्या ऐसा करने के लिए एक शेल स्क्रिप्ट है?
लिली शार्प्टन

मेरा सुझाव है कि आप वहां ऐसे ही सवालों की तलाश करें। यदि आपको अपनी आवश्यकताओं के अनुरूप कोई नहीं मिलता है, तो अपना नया प्रश्न पूछें।
दान

जवाबों:


25
find . -name '*.pdb.gz' -exec gunzip {} +

-exec gunzip {} +gunzipअपनी कमांड लाइन पर बहुत सारे लेकिन बहुत सारे फ़ाइल नामों के साथ प्रदान नहीं करेगा । यह अधिक कुशल है -exec gunzip {} \;जिससे gunzipप्रत्येक फ़ाइल के लिए एक नई प्रक्रिया शुरू होती है ।


3
एक find, कम gunzip!
दान

2
ध्यान दें कि "+" एक GNUism है और इसलिए * BSD जैसे गैर-GNU सिस्टम पर काम नहीं करेगा।
मोनिका को पुनः स्थापित करें - एम। श्रोडर

3
बीएसडी के बाद के संस्करण find"+" अंकन की अनुमति देते हैं। उदाहरण के लिए देखें,, बीएसडी 10.1 के लिए आदमी पेज । ओएस एक्स (10.9 और बाद में कम से कम, शायद पहले) पर भी लागू होता है। find
प्लाज्मा

7

जब भी आपको "तर्क सूची बहुत लंबी" त्रुटियां मिलती हैं, तो आप वांछित कमांड को कई बार लागू करके इसके चारों ओर काम कर सकते हैं, हर बार उन तर्कों का एक सबसेट जिसके साथ आप उपयोग करना चाहते हैं। xargsएक उपकरण है जो आपको स्वचालित रूप से ऐसा करने में मदद करता है।

find . -type f -a -name \*.pdb.gz -print0 | xargs -0 gunzip

क्या इसमें उतनी ही अक्षमता नहीं है, जितना -execdir gunzip "{}" \;कि xargs प्रत्येक फ़ाइल के लिए अलग से गनज़िप को लागू करेगा? वह मेरा मैन पेज पढ़ना है।
गोगुड़

5
नहीं, कमांड लाइन 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 लाइनें मिलेंगी ।
सेलादा

4
उपयोग करने xargsका एक और लाभ यह है कि, -Pविकल्प के साथ , आप gunzipसमानांतर में कई प्रक्रियाएं चला सकते हैं , जो (आपके सिस्टम के सटीक मापदंडों के आधार पर) तेज हो सकती है।
1944

सूचक के लिए धन्यवाद -P, @psmears। अब मैंने भी कुछ सीखा!
सेलाडा

1

मुझे लगता है कि यह काम करना चाहिए, यह प्रसंस्करण के लिए व्यक्तिगत रूप से गनज़िप के लिए प्रत्येक फ़ाइल का पथ / नाम देता है:

find /my/dir -name "*.pdb.gz" -execdir gunzip "{}" \;

1
वह एक बार प्रति फ़ाइल बारूद का निष्पादन करेगा। थोड़ा अलग तरीके के लिए जॉन 1024 का जवाब देखें जो उस अक्षमता से बचा जाता है।
सेलडा

@Celada यह जानबूझकर किया गया था; मेरी चिंता यह थी कि गनजिप को ओवरलोड करने के कारण + फिर से एक त्रुटि संदेश हो सकता है। अगर जॉन 1024 की विधि काम करती है, तो यह तकनीकी रूप से अधिक कुशल है, लेकिन मेरा काम करना चाहिए अगर वह नहीं करता है।
गोगुड़

1
findके साथ +और xargsस्पष्ट रूप से उस मुद्दे को ध्यान में रखते हुए डिजाइनर हैं। ऑपरेटिंग सिस्टम की सीमा से अधिक नहीं होने पर वे हमेशा उतने ही तर्कों की आपूर्ति करेंगे। क्योंकि, वैसे, यह है एक ऑपरेटिंग सिस्टम सीमा, कोई लेना देना नहीं gunzip
सेलाडा

1
@Celada ठीक है कि जानकारी के लिए धन्यवाद, तो संभवतः '+' के साथ गनज़िप एक बार से अधिक हो सकती है, लेकिन 320,000 से कम बार?
गोगुड़

1
सही बात।
सेलाडा

1

इस तरह आज़माएँ:

find . -name '*.gz' -exec gunzip {} \;

3
वह gunzipप्रति फ़ाइल एक बार निष्पादित करेगा । थोड़ा अलग तरीके के लिए जॉन 1024 का जवाब देखें जो उस अक्षमता से बचा जाता है।
सेलाडा

*
.Gz

1

यदि आपके पास एक मल्टी-कोर मशीन है, तो आप शायद देखेंगे कि gunzipआपके मशीन की क्षमताओं को अधिकतम करने के लिए उपयोग नहीं किया जा रहा है। इसके लिए आपको gunzipसमानांतर में कई s चलाने की आवश्यकता होगी । ट्रैक रखने के लिए किस टर्मिनल को हाथ से बोझिल किया जाता है, लेकिन आप इसे GNU समानांतर के साथ आसानी से कर सकते हैं:

find . -name "*.gz" | parallel -X gunzip {}

1
क्या यह विफल नहीं होगा क्योंकि तर्क सूची parallelबहुत लंबी है?
user253751

@ मिनीबिस हां, मैं मूल समस्या भूल गया, मैं अपनी पोस्ट अपडेट करूंगा
एंथन

क्या अभी भी असफल नहीं होंगे क्योंकि तर्क सूची findबहुत लंबी है?
user253751

1
हाँ, लेकिन आप सभी फ़ाइलनामों को findकमांड लाइन पर पास कर रहे हैं ।
user253751

लगता है कि यह सवालों का जवाब देने के लिए अच्छा दिन नहीं है, मैं तर्क को उद्धृत करना भूल गया-name
एंथन

-1

इसके लिए उपयोग करना अनावश्यक है find, क्योंकि आपने सबफ़ोल्डर्स का उल्लेख नहीं किया है। आपको क्या करने की आवश्यकता है:

for f in *.gz;do gunzip $f;done

4
आप करते हैं की जरूरत है findअगर तुम 320,116 अंडे देने के लिए नहीं करना चाहती gunzipप्रक्रियाओं, इस पाश की तरह करता है।
जॉन डब्ल्यूएच स्मिथ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.