"или" в оболочке glob

"или" в оболочке glob

Мне нужно найти файлы, в именах которых есть подстроки «s1r», «s2r», «s3r» или «s19r».

Я почти на месте!

Неудачные попытки:

ls *s[123][9?]r*

Вышеуказанный код дает мне только файлы, включающие подстроку

с19р

Пока

ls *s[1-3]|[19]r*

возвращается

-bash: [19]r*: команда не найдена

ls: *s[1-3]: Нет такого файла или каталога

То есть он не распознает оператор or |, что вполне логично, поскольку он также используется для конвейерной передачи.

Как найти файлы, содержащие «s1r», «s2r», «s3r» или «s19r»?

решение1

Использовать ls *s1r* *s2r* *s3r* *s19r*.

Если вас беспокоят несуществующие файлы, вы можете установить опцию nullglob:

          nullglob
                  If  set,  bash allows patterns which match no files (see
                  Pathname Expansion above) to expand to  a  null  string,
                  rather than themselves.

Если ваша оболочка не bash, то, вероятно, есть похожий способ. Посмотрите на ее man-страницу.

решение2

Возможно, вам захочется попробовать это:

ls *s?([123])r* *s19r*

Например

У меня есть каталог со следующими файлами:

% ls | column
s10r    s12r    s14r    s16r    s18r    s1r s2r s4r s6r s8r
s11r    s13r    s15r    s17r    s19r    s23r    s3r s5r s7r s9r

Используя вышеупомянутые ls:

% ls *s?([123])r* *s19r*
s19r  s1r  s2r  s3r

Смотритеруководство bash по сопоставлению с образцомБольше подробностей.

Связанный контент