ग्लोब मैच से एक पैटर्न को छोड़ दें


53

मेरे पास एक ही बेस फाइलनेम वाली कई फाइलें हैं। मैं सभी को हटाना चाहता हूं, लेकिन एक

foo.org #keep
foo.tex #delete
foo.fls #delete
foo.bib #delete
etc

अगर मुझे एक रखने की जरूरत नहीं थी, मुझे पता है कि मैं इस्तेमाल कर सकता हूं rm foo.*

टीएलडीपी^ एक मैच को नकारने के लिए प्रदर्शित करता है। परीक्षण और त्रुटि के माध्यम से, मुझे यह पता चला

rm foo.*[^org]

मुझे क्या चाहिए, लेकिन मैं वास्तव में वाक्यविन्यास को नहीं समझता।

इसके अलावा, मेरे उपयोग के मामले में कोई सीमा नहीं है, मुझे लगता है कि यह पैटर्न भी नजरअंदाज करता है foo.oऔर foo.or। यह पैटर्न कैसे काम करता है, और एक ग्लोब जो केवल अनदेखी करता है foo.org, वह कैसा दिखता है?


1
@Glen जवाब के अतिरिक्त यह उल्लेख के लायक है कि rm foo.*[^org]सभी फ़ाइलों को हटा देता है जो कि अंतिम वर्ण है o, rया तो , या gतो foo.fooमेल नहीं खाता।
जिमीज

आप एक का उपयोग कर रहे हैं Regular Expression। आपको अपने समूह पात्रों के साथ सावधान रहना चाहिए। ब्रैकेट्स का उपयोग करके आपने एक वर्ण वर्ग निर्दिष्ट किया है जिसका अर्थ है कि आप किसी भी फाइल को हटा देंगे जिसमें अक्षरों का विस्तार था o, rया gकिसी भी क्रम में। समूह बनाने और वर्णों के क्रम को संरक्षित करने के लिए कोष्ठक का प्रयोग करें।
श्री मसाकारो

3
@ jbarker2160 - यह वास्तव में एक नियमित अभिव्यक्ति नहीं है, इसे आमतौर पर एक ग्लोब (या फ़ाइलनाम पैटर्न ) कहा जाता है , जो नियमित अभिव्यक्ति का एक या अधिक उपसमुच्चय है - विवरण के लिए बैश मैनपेज का पैटर्न मिलान अनुभाग देखें। उनका पैटर्न foo.*[^org]किसी भी फ़ाइल नाम से मेल खाता है foo.जो डॉट के बाद एक या एक से अधिक वर्णों के साथ शुरू होता है जहां अंतिम वर्ण ओ, आर या जी नहीं है। तो यह मेल खाएंगे foo.orb, लेकिन नहीं foo.orgया foo.orया foo.o। ग्लेनजैकमैन का जवाब दिखाता है कि कैसे एक मैच को नकारने के लिए विस्तारित पैटर्न मिलान सुविधाओं को सक्षम किया जाए।
जॉनी

जवाबों:


52
shopt -s extglob
echo rm foo.!(org)

यह "फू" है। इसके बाद कुछ भी नहीं "org"

रेफरी: https://www.gnu.org/software/bash/manual/bashref.html#Pattern-Matching


मैंने ऐसा ही करने की कोशिश की लेकिन कोष्ठक के साथ और जाहिरा तौर पर जब कोष्ठक का उपयोग करते हुए यह काम नहीं करता है
डोनैटो

4
कई फ़ाइल नामों से मिलान करने के लिए सिंटैक्स क्या है? मैं बाहर करना चाहता हूँ .org, .png, .txt
फ्रीडो

@ @()एक पैटर्न-सूची के लिए नस्ल : stackoverflow.com/a/217208/3779853
phil294

23

बैश में, आप भी उपयोग कर सकते हैं GLOBIGNORE="*.org"; rm -i foo*

और unset GLOBIGNOREजब हो गया।

यह वास्तव में बेहतर नहीं है shopt -s extglob, लेकिन मुझे याद रखना आसान है।


5
@Ruslan जो काम नहीं करता है। आपको करना चाहिए( GLOBIGNORE="*.org"; rm -i foo* )
DBedrenko

3
ध्यान दें कि यदि आप उपेक्षित सूची का विस्तार करना चाहते हैं, तो एक बृहदान्त्र के साथ अलग करें, जैसेGLOBIGNORE="*foo*:*bar*"
फाइटैट

7

एक पाइप कर सकता है?

ls * | grep -v "foo.org" | xargs -I {} echo {}

(जाहिर है कि आप अंतिम श्रृंखला में आरसी के साथ प्रतिध्वनि बदलना चाहते हैं)।


उपयोगी है अगर सिर्फ एक पंक्ति में जरूरत है।
ब्रूस्कीउज

1
याद रखना आसान है (मेरे लिए, मैं उस तरह की बात अक्सर करता हूं) और बूट करने के लिए अधिक जटिल प्रसंस्करण की अनुमति देता है :)
drevicko

1
ls -1यह सुनिश्चित करने के लिए अधिक विश्वसनीय होना चाहिए कि सभी फ़ाइलों को grepअलग से नियंत्रित किया जाए
माइकलचिरिको

0

ओपी बहुत करीब था:

rm foo.*[^o][^r][^g]

हालांकि इस मामले में *अनावश्यक है।

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