Використання шаблонів АБО в подстановочних символах оболонок


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*}

7
Ні, це не так: touch day.txt; touch night.txt; ls {*day,night*}результати вls: *day: No such file or directory
Маттео

1
Я адаптував оригінальний текст афіші; Я думав, що це було зрозуміло. зітхати . Текст оновлено. Невже ви можете бачити, що механізм працює?
йогобрюс

7
Або, можливо *{day,night}*, ближче до того, чого хоче ОП.
дероберт

25

Немає можливості lsфільтрувати на ім'я файлу, але в більшості оболонок є глобальне розширенняman 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}*. Я б редагував це, але не знаю, які оболонки підтримують його?
Випадково832

@ Random832 Працює в bash, kshі zsh(нікому не потрібно розширеного глобулювання), але ні sh- однак, останній приклад Нахуела "всі оболонки" працює sh.
Ізката

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.