
Мне нужно найти файлы, в именах которых есть подстроки «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 по сопоставлению с образцомБольше подробностей.