Belirtilen dosya dışındaki tüm dosyalar nasıl bulunur?


13

lsGibi bir sonuç verebilir

[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

Ama aslında ben sadece öğrenmek için umut CentOS-Base.repo, CentOS-Debuginfo.repove CentOS-Vault.repoancak CentOS-Media.repo. Bu komutu çalıştırıyorum

ls [^\(Media\)]

Ama bir hata bilgisi alıyorum, nasıl yapmalıyım?



@steeldriver Bağlantınız için teşekkürler, bu benim için çok yararlı ..
yode

Bu hizmeti kullanmak için kabuk değiştirme düşünebilirsiniz zsh bir sahiptir, desen çıkarma tesisi
Basile Starynkevitch

Yanıtlar:


10

En basit durumda aşağıdakileri kullanabilirsiniz (1. alt kelimenin statik olması durumunda CentOS):

ls CentOS-[BDV]*

  • [BDV] - belirtilen alt karakterlerden biriyle başlayan ikinci alt sözcüğün sağlanması için karakter sınıfı

veya olumsuzlama ile aynı :

ls CentOS-[^M]*

MKarakteri içeren tüm dosya adlarını yok saymak istiyorsanız , GNU uygulamasıyla ls(tipik olarak CentOS'ta bulunur), -I( --ignore) seçeneğini kullanın:

ls -I '*M*'

-I, --ignore = KALIP
yapmak kabuk uymayan liste ima girişleri ŞABLONUNUN

MediaKelime içeren girişleri yoksaymak için :

ls -I '*Media*'

Bu örüntülerin kelimesi kelimesine geçilmesi gerekir ls, bu yüzden alıntılanmalıdır (aksi takdirde, kabuk genişlemek için onları glob olarak kabul eder).


Neden ls *[^M]*
yo

ls CentOS-[^M]*Çalışır, ancak ls *[^M]*yapamaz ..
yode

@yode, tam olarak neyi ihmal etmek istediğinize bağlıdır: Mkarakter oluşumu VEYA Mediakelime?
RomanPerekhrest

Ama benim durumumda, sadece o dosyanın bir karakteri var M.
yode

3
Desenler açgözlüdür: ilk * son harf hariç her şeyle eşleşir, [^ M] hiçbiri M ile bitmediği ve sondaki * boş dizeyle eşleşmediği için son harfle eşleşir. Yani hepsi eşleşiyor. Ve M ile bir şey bitse bile, bir yerde M'den farklı bir şey olduğu varsayılarak hala eşleşir: örneğin OOM adlı bir dosyanız varsa, ilk yıldız ilk O ile eşleşir, [^ M] ikinci O ile eşleşir ve sondaki başlangıç ​​M. ile eşleşir
NickD

12

Birkaç merminin olumsuzluk yapan operatörleri vardır:

  • 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

Seçeneklerden biri kullanımda olan findile -not -name bayraklar. Yani find . -not -name CentOS-Media.repo. Dizin yapısını geri almak istemiyorsanız, -maxdepth 1bayrak ekleyin .

Alternatif olarak, aşağıdakiler yazılabilir (ki bu çok daha karmaşıktır, ancak -notbayrağı unuttum ve bu cevabı orijinal olarak gönderdim, bu yüzden bu kısmı silmeyeceğim):

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

findDosya adlarını boş bayt ile ayırmaya zorlamanız gerekir , böylece dosya adlarındaki yeni satırlar hiçbir şeyi bozmaz. Umarım, grepbu tür ayırıcıyı bayrakla destekler -z. İle tipik ayırmaya (yani null bayt -> yeni satır) geri dönmek isteyebilirsiniztr '\0' '\n'


1
Ayrıca printf '%s\0' *, varsayılan olarak nokta dosyaları içermeyen ve varsayılan olarak nokta dosyaları içermeyen boş ayrılmış dosya adları da alabilirsiniz (ancak bazı kabuklarda bunun için bir seçenek vardır). Ayrıca gerekmez -Eiçin bu regexp, ama ya kullanılan karakterler gerektiğini Seçici olmak için .ya içine koyun []ve siz bağlıdır GNU bulup grep.
dave_thompson_085

4

En kolay yol find'ı kullanmaktır. Yapmak:

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

Burada "f" yalnızca normal dosyaları aramak anlamına gelir ( normal dosyalara sembolik bağlantıları hariç tutar; GNU ile bunları eklemek için findkullanın -xtype f). Dizin aramak istiyorsanız, bunun yerine "d" yi iletin.

( -maxdepthbaşlangıçta bir GNU uzantısı artık oldukça yaygın findolsa da, bunu desteklemiyorsa -maxdepth 1, standartla değiştirebilirsiniz ! -name . -prune).

bkz bulmak adam sayfasını daha müthiş özellikler için.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.