नियमित अभिव्यक्ति के साथ फ़ाइलें हटाएँ


40

मैंने उन फ़ाइलों को हटाने की कोशिश की जो A से शुरू होती हैं और 2 नंबरों के साथ समाप्त होती हैं लेकिन यह एक काम नहीं करता है।
मैंने क्या कोशिश की:

rm ^A*[0..9]2$

मैं गलत कहाँ हूँ?

जवाबों:


56

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

ls | grep -P "^A.*[0-9]{2}$" | xargs -d"\n" rm

यह काम किस प्रकार करता है:

  1. ls सभी फाइलों को सूचीबद्ध करता है (परिणाम के बाद से लाइन में एक)।

  2. grep -P "^A.*[0-9]{2}$" फ़ाइलों की सूची को फ़िल्टर करता है और केवल उन लोगों को छोड़ देता है जो नियमित अभिव्यक्ति से मेल खाते हैं ^A.*[0-9]{2}$

    • .*किसी भी संख्या में होने वाली घटनाओं को इंगित करता है ., जहां .किसी भी वर्ण से मेल खाता वाइल्डकार्ड है।

    • [0-9]{2}[0-9]किसी भी अंक के ठीक दो होने का संकेत देता है ।

  3. xargs -d"\n" rmrm lineहर lineउस के लिए एक बार कार्यान्वित किया जाता है जो इसे पाइप किया जाता है।

मैं गलत कहाँ हूँ?

शुरुआत के लिए, rmएक तर्क के रूप में एक नियमित अभिव्यक्ति को स्वीकार नहीं करता है। वाइल्डकार्ड के अलावा *, हर दूसरे वर्ण का इलाज शाब्दिक रूप से किया जाता है।

इसके अलावा, आपकी नियमित अभिव्यक्ति थोड़ी दूर है। उदाहरण के लिए, *के किसी भी घटनाओं का मतलब है ...एक नियमित अभिव्यक्ति में है, इसलिए A*मैचों A, AAआदि और यहां तक कि एक खाली स्ट्रिंग।

अधिक जानकारी के लिए, Regular-Expressions.info पर जाएं ।


3
फ़ाइल नामों में रिक्त स्थान से सावधान रहें।
slhck

1
-d"\nस्विच रिक्त स्थान समस्या ठीक हो जाती।
फ्राग

1
नोट - कुछ डिस्ट्रोस (जैसे मैक ओएस) में एक grep -P(पर्ल रेगेक्स) नहीं है। grep -Eइस मामले में काम कर सकते हैं।
ब्लूस्क्रेबी

1
मैं उपयोग करने को प्राथमिकता -Iके साथ xargsऔर हमेशा पहले गैर घातक आदेशों के साथ परीक्षण:xargs -d"\n" -I {} echo "{}"
jozxyqk

1
पारसिंग ls? इस प्रश्न को देखें जो इस लेख की ओर इशारा करता है । नुकसान की वजह से आप rmक्या करना चाहते हो सकता है।
कामिल मैकियोरोस्की

45

या उपयोग कर रहा है find:

find your-directory/ -name 'A*[0-9][0-9]' -delete

यह समाधान अजीब फ़ाइल नामों से निपटेगा।


4
यह एक बेहतरीन उपाय है। मैं इसे पसंद करता हूं क्योंकि यह अधिक सरल है और आप पहले से -delete ध्वज को छोड़ सकते हैं यह देखने के लिए कि क्या आपकी फ़ाइलों को हटाने से पहले आपका regex सही है या नहीं।
JAMESSTONEco

1
इसके अलावा आप जो कुछ भी हटाते हैं उस पर आपका अधिक नियंत्रण है, उदाहरण के लिए-type f
मार्को सुल

क्या इसका उपयोग फ़ाइलों और फ़ोल्डरों को हटाने के लिए किया जा सकता है? यह गैर-खाली फ़ोल्डर के लिए काम नहीं करता है।
एलेक्स

@ नेट नोप, निर्देशिका खाली होना चाहिए (यह वैसे भी एक ओपी आवश्यकता नहीं थी), आप के xargsसाथ दृष्टिकोण का उपयोग कर सकते हैं rm -f
cYrus

10

बैश मैन पेज का फ़ाइल नाम विस्तार अनुभाग देखें :

rm A*[0-9][0-9]

मेरे लिए अच्छा काम किया।
निशांत मठ

यह प्रश्न का सबसे सरल, फिर भी पूर्ण उत्तर था।
जनक मीणा

क्या यह काम करेगा अगर फ़ोल्डर में बहुत सारी फाइलें हैं?
ईटी

1

रेगेक्सप के साथ समाधान 200 गुना बेहतर है, यहां तक ​​कि इसके साथ ही आप देख सकते हैं कि कमांड का उपयोग करने से पहले कौन सी फ़ाइल हटा दी जाएगी, अंतिम पाइप काट कर:

ls | grep -P "^A.*[0-9]{2}$"

यदि यह सही है तो बस उपयोग करें:

ls | grep -P "^A.*[0-9]{2}$" | xargs -d "\n" rm

यह 200 गुना बेहतर है क्योंकि यदि आप यूनिक्स के साथ काम करते हैं तो यह जानना महत्वपूर्ण है कि ग्रीप का उपयोग कैसे किया जाए। यदि आप इसका उपयोग करना जानते हैं तो यह बहुत शक्तिशाली है।


1
यह डेनिस के 4 वर्षीय उत्तर के पहले से ही कहे गए विवरणों से बहुत कुछ जोड़ नहीं सकता है ।
8bittree

1
"200 बार" एक बहुत विशिष्ट है। बहुत सारे अन्य आदेश बहुत शक्तिशाली हैं, आपको बस इतना ही सीखना है कि उनका उपयोग कैसे करें।
ग्लेन जैकमैन

1

यह मेरे मैक पर काम करता है:

rm $(ls | grep -e '^A*[0..9]2$')


0

find कमांड रीगेक्स के साथ भी काम करता है।

जांचें कि कौन सी फाइलें डिलीट होने वाली हैं

find . -regex '^A.*[0-9]{2}$'

फाइलों को नष्ट

find . -regex '^A.*[0-9]{2}$' -delete
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.