Использование шаблонов OR в подстановочных знаках оболочки

52

Содержимое моего каталога

$ 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

Я хотел бы перечислить детали файлов, которые имеют слово в имени файла, как указано.

Пример :

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

Ожидаемый результат

-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

Как перечислить разные файлы, соответствующие двум разным партнерам, или вкратце, как использовать регулярные выражения ls, чтобы я мог ORиспользовать части имени файла.

Оригинальный сценарий, есть много файлов в каталоге, сократили случай для запроса.

холодный морской тропический воздух
источник

Ответы:

65

Вам даже не нужно активировать расширенное сглаживание, чтобы делать то, что вы хотите. Это будет работать в Bash:

ls {day*,night*}
itsbruce
источник
8
Нет, это не так: touch day.txt; touch night.txt; ls {*day,night*}результатыls: *day: No such file or directory
Маттео
1
Я адаптировал оригинальный текст плаката; Я думал, что это было ясно. Вздох . Текст обновлен. Наверняка вы видите, что механизм работает?
Брюс
7
Или, возможно *{day,night}*, ближе к тому, что хочет ОП.
Дероберт
25

Там нет опции lsдля фильтрации по имени файла, но в большинстве оболочек есть расширение globbingman bash /Pattern Matching

КШ

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

ЗШ

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

или же:

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

удар

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

В любой из этих трех оболочек вы можете сделать это, но учтите, что если один из случаев не соответствует ни одному файлу, этот шаблон останется нерасширенным (например, *day* night1.txt othernight.txtесли имя файла не содержит day; см. man bash /EXPANSIONИли /Brace Expansionконкретно):

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

В любой оболочке вы можете сделать:

ls -lrtd -- *day* *night*

В zsh, если нет dayили nightфайла, последние две команды потерпят неудачу; установите параметр nonomatchили csh_null_glob, или добавьте (N)после каждого шаблона, чтобы избежать этого.

Науэль Фуйе
источник
1
Что о *{day,night}*. Я бы отредактировал это, но я не знаю, какие оболочки поддерживают это?
Random832
@ Random832 Работает в bash, kshи zsh(ни один не нуждается в расширенной глобализации), но нет sh- однако последний пример Науэля "все оболочки" работает в sh.
Изката
14

Оболочки не используют регулярные выражения для расширения аргумента.

Вы можете включить расширенное сопоставление с образцом

$ shopt -s extglob

а потом

$ ls @(day|night).txt
day.txt   night.txt

Смотрите, например, Справочное руководство Bash (Pattern Matching)

Matteo
источник