Czy wyświetlasz listę plików pasujących do wzorca, ale ignorujesz pliki pasujące do innego wzorca?

12

Powiedzmy, że mam katalog z plikami a1, a2, a3, b1, b2, b3. Chcę tylko dopasować pliki, które zaczynają się od, aale nie zawierają 3. Próbowałem, ls -I "*3" *a*ale powraca a1 a2 a3, chociaż nie chcę, żeby pasowało a3. Czy to jest możliwe ls?

Steven
źródło
interesujący różnorodny zestaw odpowiedzi tutaj, ale wyjaśnienie, dlaczego ls-I '* 3' a * nie powiedzie się, byłoby budujące. i / lub dlaczego globowana lista powłoki nie jest następnie filtrowana przez przełącznik ignorowania na ls?
Theophrastus,
Strona podręcznika mówi o opcji -I: do not list implied entries matching shell PATTERNjednak nie wyjaśnia, co należy rozumieć pod pojęciem domyślnym , ale domyślam się, że dotyczy to tylko plików, które lsuzyskują rozszerzenia globalne - i lsnie rozwija a*, powłoka robi to .
Murray Jensen

Odpowiedzi:

14

Właśnie:

shopt -s extglob  
ls a!(*3*)
  • shopt -s extglob aktywuje rozszerzone globowanie.
  • a pasuje do początku a
  • !()neguje dopasowanie wewnątrz ()...
    • *3*który jest 3i cokolwiek przed nim lub po nim.

$ touch 1 2 3 a1 a2 a3 b1 b2 b3 aa1 aa2 aa3 a2a a3a
$ ls a!(*3*)
a1  a2  a2a  aa1  aa2
chaos
źródło
1
Do Twojej wiadomości, wymagaset -s extglob
Brian
@Brian Yea, właśnie zauważyłem ^^
chaos
8

Istniejące odpowiedzi dobrze określają najlepszy sposób, aby to zrobić za pomocą globów; Dołączę to, ponieważ w większości przypadków findjest lepszą opcją, jeśli chcesz wykonać skrypty lub dalsze przetwarzanie:

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

Możesz podać odpowiedź do xargsłatwych działań lub do while readpętli dla bardziej skomplikowanych rzeczy.

Tom Hunt
źródło
4

Łatwy sposób to

  • aby wyświetlić listę wszystkich pasujących plików a*
  • następnie usuń wszystkie linie zawierające 3

Komenda UNIX to

ls -1 a* | grep -v 3

ls -1 pokazuje jeden plik w linii.

grepzwykle znajduje linie, które pasują do wzorca, ale przy -vtakim zachowaniu jest odwrócone, tzn. grep znajduje linię, która nie pasuje do tego wzorca.

Peter K.
źródło
2
Cześć Piotr! Najlepiej byłoby wyjaśnić, tak szczegółowo, jak to istotne, jak działa twoje rozwiązanie.
dhag
2
Parsowanie lsnie jest pomysł Goob: mywiki.wooledge.org/ParsingLs
chaos
3

Za zshpomocą ~ operatora glob :

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

Dzięki gnu lsmożesz skorzystać z dwóch --ignoreopcji:

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

pierwszy ignoruje wszystkie nazwy plików, które nie zaczynają się od, aa drugi ignoruje nazwy plików, które zawierają3

don_crissti
źródło