Używanie wzorów OR w znakach wieloznacznych powłoki


52

Treści mojego reż

$ ls -lrt
total 0
-rw-r--r-- 1 user1 admin 19 Oct  8 12:31 night.txt
-rw-r--r-- 1 user1 admin 19 Oct  8 12:31 noon.txt
-rw-r--r-- 1 user1 admin 38 Oct  8 12:31 day.txt

Chciałbym wymienić szczegóły plików, które zawierają słowo w nazwie pliku, jak określono.

Przykład:

$ ls -lrt *day|night*
ls: *day: No such file or directory
bash: night.txt: command not found

Oczekiwany wynik

-rw-r--r-- 1 user1 admin 19 Oct  8 12:31 night.txt
-rw-r--r-- 1 user1 admin 38 Oct  8 12:31 day.txt

Jak wypisać różne pliki pasujące do 2 różnych partternów, lub w skrócie, jak używać wyrażenia regularnego z ls, aby móc ORczęści nazwy pliku.

Oryginalny scenariusz, w katalogu jest wiele plików, skróciłem sprawę o zapytanie.

Odpowiedzi:


65

Nie potrzebujesz nawet włączonego rozszerzonego globowania, aby robić to, co chcesz. To zadziała w bash:

ls {day*,night*}

7
Nie, nie robi: touch day.txt; touch night.txt; ls {*day,night*}wynikils: *day: No such file or directory
Matteo,

1
Dostosowałem tekst oryginalnego plakatu; Myślałem, że to jasne. westchnienie . Tekst zaktualizowany. Na pewno widać, że mechanizm działa?
itsbruce

7
A może *{day,night}*jest bliżej tego, czego chce PO.
derobert

25

Nie ma opcji lsfiltrowania według nazwy pliku, ale w większości powłok istnieje rozszerzenie globbingman bash /Pattern Matching

ksh

ls -lrtd -- *@(day|night)*

zsh

setopt extendedglob
ls -lrtd -- *(day|night)*

lub:

setopt kshglob
ls -lrtd -- *@(day|night)*

grzmotnąć

shopt -s extglob
ls -lrtd -- *@(day|night)*

Możesz to zrobić w dowolnej z tych trzech powłok, ale zwróć uwagę, że jeśli jeden ze przypadków nie pasuje do żadnego pliku, wzorzec pozostanie nierozwinięty (np. *day* night1.txt othernight.txtJeśli nazwa pliku nie zawiera day; zobacz man bash /EXPANSIONlub /Brace Expansionkonkretnie):

ls -lrtd -- *{day,night}*

W dowolnej powłoce możesz wykonać:

ls -lrtd -- *day* *night*

W zsh, jeśli nie ma pliku daylub nightpliku, ostatnie dwa polecenia zakończą się niepowodzeniem; ustaw nonomatchlub csh_null_globopcji, lub dodać (N)po każdym wzorze, aby tego uniknąć.


1
Co *{day,night}*. Chciałbym go edytować, ale nie wiem, które powłoki to obsługują?
Random832,

@ Random832 Działa w bash, kshi zsh(żadna nie wymaga rozszerzonego globowania), ale nie sh- jednak ostatni przykład Nahuela dotyczący „wszystkich powłok” działa sh.
Izkata,

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.