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.

Mt.
źródło

Odpowiedzi:

65

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

ls {day*,night*}
itsbruce
źródło
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ąć.

Nahuel Fouilleul
źródło
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,