Bir kalıpla eşleşen ancak başka bir kalıpla eşleşen dosyaları yoksay?


12

Diyelim ki a1, a2, a3, b1, b2, b3 dosyaları içeren bir dizinim var. Yalnızca ile başlayan aancak içermeyen dosyaları eşleştirmek istiyorum 3. Denedim ls -I "*3" *a*ama a1 a2 a3eşleşmesini istemememe rağmen geri dönüyor a3. Bu mümkün mü ls?


ilginç çeşitli cevaplar burada, ama ls -I '* 3' a * 'nın neden başarısız olduğuna dair bir açıklama editördür. ve / veya neden kabuğun globbed listesi yoksayma anahtarı tarafından daha sonra ls olarak filtrelenmiyor?
Theophrastus

Man sayfası -I seçeneği hakkında diyor: do not list implied entries matching shell PATTERNancak ima edilenin ne anlama geldiğini açıklamıyor , ancak sadece lsglob genişletmeleri ile alınan dosyalar için geçerli olduğunu tahmin ediyorum - ve lsbunu genişletmiyor a*, kabuk bunu yapıyor .
Murray Jensen

Yanıtlar:


14

Sadece:

shopt -s extglob  
ls a!(*3*)
  • shopt -s extglob uzatılmış globbing'i etkinleştirir.
  • a başlangıç ​​ile eşleşir a
  • !()içindeki maçı reddediyor ()...
    • *3*hangisi 3önce ve sonra.

$ touch 1 2 3 a1 a2 a3 b1 b2 b3 aa1 aa2 aa3 a2a a3a
$ ls a!(*3*)
a1  a2  a2a  aa1  aa2

1
Bilginize, gerekliset -s extglob
Brian

@Yrian Yea, sadece fark etti ^^
kaos

8

Mevcut cevaplar bunu glob ile yapmanın en iyi yolunu belirtir; Bunu dahil edeceğim çünkü çoğu durumda findkomut dosyası oluşturma veya daha fazla işlem yapmak istiyorsanız daha iyi bir seçenektir:

$ find . -maxdepth 1 -name 'a*' -not -name '*3*'
./a1
./a2

xargsKolay eylemler için cevabı veya while readdaha karmaşık şeyler için bir döngüyü besleyebilirsiniz .


4

Kolay bir yol

  • eşleşen tüm dosyaları listelemek için a*
  • ardından bir 3

UNIX komutu

ls -1 a* | grep -v 3

ls -1 satır başına bir dosya gösterir.

grepnormalde bir kalıpla eşleşen satırları bulur, ancak -vbu davranışla ters çevrilir, yani grep bu kalıpla eşleşmeyen satırı bulur.


2
Merhaba Peter! Çözümünüzün nasıl çalıştığını ilgili olduğu kadar ayrıntılı olarak açıklamak en iyisi olacaktır.
dhag

2
Ayrıştırma lsbir goob fikri değil: mywiki.wooledge.org/ParsingLs
kaos

3

İle zshkullanarak, ~ glob operatörünü :

setopt extendedglob
print -rl -- a*~*3*

İle gnu lsiki --ignoreseçenek kullanabilirsiniz :

ls -I '[^a]*' -I '*3*'

birincisi ile başlamayan tüm dosya adlarını ave ikincisi3

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.