निर्दिष्ट फ़ाइल को छोड़कर सभी फ़ाइलों को कैसे ढूंढें


13

lsकी तरह एक परिणाम दे सकते हैं

[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ls

CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo

लेकिन असल में मैं सिर्फ पता लगाने के लिए आशा CentOS-Base.repo, CentOS-Debuginfo.repoऔर CentOS-Vault.repoनहीं लेकिन CentOS-Media.repo। इसलिए मैं यह कमांड चलाता हूं

ls [^\(Media\)]

लेकिन मुझे एक त्रुटि जानकारी मिलती है। मुझे क्या करना चाहिए?



@steeldriver आपके लिंक के लिए धन्यवाद, जो मेरे लिए बहुत उपयोगी है ..
yode

आप अपने शेल को zsh पर स्विच करने पर विचार कर सकते हैं , जिसमें पैटर्न हटाने की सुविधा है
Basile Starynkevitch

जवाबों:


10

सबसे सरल मामले में आप निम्नलिखित का उपयोग कर सकते हैं (यदि मामला 1 अधीनस्थ स्थिर है CentOS):

ls CentOS-[BDV]*

  • [BDV] - वर्ण वर्ग निर्दिष्ट पात्रों में से किसी एक के साथ शुरू होने वाले दूसरे अधीन को सुनिश्चित करने के लिए

या नकार के साथ समान :

ls CentOS-[^M]*

यदि आप उन सभी फ़ाइलनामों को अनदेखा करना चाहते हैं जिनमें Mचरित्र शामिल है , तो GNU के कार्यान्वयन के साथ ls(जैसा कि आमतौर पर CentOS पर पाया जाता है), -I( --ignore) विकल्प का उपयोग करें :

ls -I '*M*'

-I, --ignore = PATTERN
अंतर्निहित प्रविष्टियों की सूची PATTERN से मेल नहीं खाता है

Mediaशब्द के साथ प्रविष्टियों को अनदेखा करने के लिए :

ls -I '*Media*'

उन पैटर्न को शब्दशः पास करने की आवश्यकता है ls, इसलिए उद्धृत किया जाना चाहिए (अन्यथा, शेल उन्हें विस्तार करने के लिए ग्लब्स के रूप में व्यवहार करेगा)।


हम उपयोग नहीं कर सकते क्यों ls *[^M]*?
yode

ls CentOS-[^M]*काम है, लेकिन ls *[^M]*ऐसा नहीं ..
yode

@ योड, इस बात पर निर्भर करता है कि आप वास्तव में क्या उपेक्षा करना चाहते हैं: Mचरित्र घटना या Mediaशब्द?
रोमनप्रेह्रेस्ट

लेकिन मेरे मामले में, केवल उस फ़ाइल में एक चार्जर है M
योद २३'१ at को ११:११

3
पैटर्न लालची हैं: पहला * अंतिम अक्षर को छोड़कर सब कुछ से मेल खाता है, [^ M] अंतिम अक्षर से मेल खाता है क्योंकि उनमें से कोई भी M से समाप्त नहीं होता है और अनुगामी * खाली स्ट्रिंग से मेल खाता है। इसलिए वे सभी मेल खाते हैं। और यहां तक ​​कि अगर एम के साथ कुछ समाप्त हो गया, तो भी यह मेल खाएगा, यह मानते हुए कि एम कहीं से कुछ अलग था: जैसे अगर आपके पास ओओएम नामक एक फ़ाइल थी, तो पहला स्टार पहले ओ से मेल खाएगा, [^ एम] दूसरे ओ से मेल खाएगा। और अनुगामी शुरुआत एम।
निकड

12

कुछ खोलों में ग्लोबिंग ऑपरेटर्स की उपेक्षा होती है:

  • zsh -o extendedglob:

    ls -d -- ^*Media*
    ls -d -- *.repo~*Media* # ~ is "except" operator
    
  • ksh, zsh -o kshglob, bash -O extglob:

    ls -d -- !(*Media*)
    
  • bash:

    GLOBIGNORE='*Media*'
    ls -d -- *
    
  • ksh:

    FIGNORE='@(*Media|.)*'
    ls -d -- *
    

6

एक विकल्प झंडे के findसाथ उपयोग करना है -not -name। Ie find . -not -name CentOS-Media.repo। यदि आप निर्देशिका संरचना को फिर से जोड़ना नहीं चाहते हैं, तो -maxdepth 1ध्वज जोड़ें ।

वैकल्पिक रूप से, एक निम्नलिखित लिख सकता है (जो कि बहुत अधिक जटिल है, लेकिन मैं -notध्वज के बारे में भूल गया और मूल रूप से इस उत्तर को पोस्ट किया, इसलिए मैं इस हिस्से को नहीं हटाऊंगा):

find . -print0 | grep --invert-match -z "CentOS-Media.repo$" | tr '\0' '\n'

आपको findनल बाइट के साथ फ़ाइलनाम को अलग करने के लिए मजबूर करने की आवश्यकता है , ताकि फ़ाइल नाम में नई लाइनें कुछ भी टूट न जाएं। उम्मीद है, grepध्वज के साथ इस तरह के विभाजक का समर्थन करता है -z। आप विशिष्ट पृथक्करण (यानी नल बाइट -> नई लाइन) के साथ वापस लौटना चाह सकते हैंtr '\0' '\n'


1
आप अशक्त-अलग फ़ाइलनाम भी प्राप्त कर सकते हैं printf '%s\0' *जिसके साथ पुनरावृत्ति नहीं होती है और डिफ़ॉल्ट रूप से डॉटफ़ाइल्स शामिल नहीं होते हैं (लेकिन कुछ गोले उस के लिए एक विकल्प है)। तुम भी उस regexp के -Eलिए की जरूरत नहीं है , लेकिन picky होने के लिए आपको या तो बैकस्लैश करना चाहिए या इसे डाल देना चाहिए , और आप GNU खोज और grep पर निर्भर करते हैं । .[]
dave_thompson_085

4

सबसे आसान तरीका है, खोजने का उपयोग करें। कर:

find . -maxdepth 1 -type f ! -name "CentOS-Media.repo"

यहाँ "f" का अर्थ है केवल नियमित फ़ाइलों की खोज करना (नियमित फ़ाइलों के लिए सहानुभूति को छोड़कर, हालांकि, GNU के साथ find, -xtype fउन्हें शामिल करने के बजाय उपयोग करें)। यदि आप निर्देशिकाओं को खोजना चाहते हैं, तो इसके बजाय "d" पास करें।

( -maxdepthजबकि शुरू में एक GNU एक्सटेंशन अब काफी सामान्य है। यदि आपका findसमर्थन नहीं करता है, तो आप -maxdepth 1मानक के साथ बदल सकते हैं ! -name . -prune)।

अधिक भयानक सुविधाओं के लिए खोज मैन पेज देखें ।

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