मैं एक सामान्य उपसर्ग और प्रत्यय के साथ कई फाइलें कैसे निकालूं?


21

मेरे पास कई फाइलें हैं

sequence_1_0001.jpg  
sequence_1_0002.jpg  
sequence_1_0003.jpg  
...

और नाम की फाइलें

sequence_1_0001.hmf  
sequence_1_0002.hmf  
sequence_1_0003.hmf  
...

और नाम की फाइलें

sequence_2_0001.jpg  
sequence_2_0002.jpg  
sequence_2_0003.jpg  
...

तथा

sequence_2_0001.hmf  
sequence_2_0002.hmf  
sequence_2_0003.hmf  
...

मैं केवल उन फ़ाइलों को हटाना चाहता हूं जो 'अनुक्रम 1' से शुरू होती हैं और '.hmf' में समाप्त होती हैं, लेकिन मैं उन्हें एक-एक करके निकालना नहीं चाहता, क्योंकि हजारों फाइलें हैं। मैं उस rm कमांड को कैसे निर्दिष्ट कर सकता हूं जिसे मैं प्रीफ़िल्क्स 'अनुक्रम 1' से शुरू करने और '.hmf' में समाप्त करने के लिए सभी को निकालना चाहता हूं?

मैं वर्तमान में RedHat Linux सिस्टम के साथ काम कर रहा हूं, लेकिन मैं यह जानना चाहूंगा कि इसे अन्य वितरणों पर भी कैसे किया जाए।

जवाबों:


28
rm sequence_1*.hmf

के साथ शुरू sequence_1और समाप्त होने वाली फ़ाइलों को निकालता है .hmf


ग्लोबिंग वह प्रक्रिया है जिसमें आपका शेल एक पैटर्न लेता है और इसे उस पैटर्न से मेल खाते हुए फ़ाइलनाम की सूची में विस्तारित करता है। इसे नियमित अभिव्यक्तियों के साथ भ्रमित न करें, जो अलग है। यदि आप अपना अधिकांश समय अंदर बिताते हैं bash, तो वूलेज विकी के पास ग्लोबिंग (पथनाम विस्तार) पर एक अच्छा पृष्ठ है । यदि आप अधिकतम पोर्टेबिलिटी चाहते हैं, तो आप पैटर्न मिलान पर पोसिक्स युक्ति को भी / इसके बजाय पढ़ना चाहेंगे ।


यदि आप "तर्क सूची" बहुत लंबी " त्रुटि में चलते हैं , तो आप BashFAQ 95 पर एक नज़र डाल सकते हैं , जो इसे संबोधित करता है। जब तक कि त्रुटि दूर नहीं हो जाती, तब तक सबसे सरल समाधान ग्लोब पैटर्न को कई छोटे हिस्सों में तोड़ना है। आपके मामले में, आप संभवत: 9 के माध्यम से उपसर्ग अंक 0 से मैच को विभाजित करके भाग सकते हैं:

for c in {0..9}; do rm sequence_1_"$c"*.hmf; done
rm sequence_1*.hmf  # catch-all case

यह 'तर्क सूची बहुत लंबी' त्रुटि के आसपास एक बहुत ही चतुर काम है। मेरे मामले में, मेरे पास बीस हजार फाइलें हैं, इसलिए मुझे लगता है कि मुझे 0, .., 20 से लूप के लिए उपयोग करना होगा। सही?
पॉल

@ पाओल राइट, बस सूची को उतने ही विखंडू में तोड़ें जितने की जरूरत है, हालांकि कुछ बिंदु पर findदृष्टिकोण अनुमान और जांच से आसान हो जाता है।
jw013

14

यद्यपि jw013 का उत्तर सही wrt ग्लोबिंग है, लेकिन यदि आप हजारों मैच करते हैं तो यह कमांड विफल हो सकती है: rm sequence_1_0001.hmf sequence_1_0002.hmf ...शेल द्वारा उत्पन्न विस्तारित कमांड लाइन बस बहुत बड़ी हो सकती है।

जैसा कि डोम ने सुझाव दिया है, आप इसके -deleteसाथ विकल्प का उपयोग भी कर सकते हैं find:

find . -maxdepth 1 -type f -name 'sequence_1*.hmf' -delete

दोनों -maxdepthऔर -delete, में नहीं है, जबकि POSIX मानक में काफी आम है findजंगली में कार्यान्वयन। लिनक्स वितरण आमतौर पर GNU का उपयोग करते हैं find, जो निश्चित रूप से उन विकल्पों का समर्थन करता है।


2
यदि आप कर सकते हैं, खोजने के लिए -delete विकल्प का उपयोग करें, यह प्रत्येक फ़ाइल के लिए कांटा नहीं करता है ...
डोम

जोड़ा, जयकार। ऐसा लगता है कि -deleteहाल ही में GNU और BSD सिस्टम पर समर्थित होना चाहिए , जबकि -print0GNU-only है। इसलिए यह अधिक पोर्टेबल होने की संभावना है (हालांकि यह ओपी के लिए एक अंतर नहीं होना चाहिए)।
बेकार 13

कम से कम OS X की खोज में -print0 है, लेकिन यह POSIX में शामिल नहीं है।
लारी

5
rm sequence_1_{0000..0999}.hmf
rm sequence_1_{1000..1999}.hmf
rm sequence_1_{2000..2999}.hmf
...

बाश में भी काम करेगा।


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