shell glob 中的“或”

shell glob 中的“或”

我想 ls 文件名中包含子字符串“s1r”、“s2r”、“s3r”或“s19r”的文件。

我快到了!

拙劣的尝试:

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

上面只给我包含子字符串的文件

s19r

尽管

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

回报

-bash: [19]r*: 未找到命令

ls: *s[1-3]: 没有那个文件或目录

也就是说,它不识别或 |运算符 - 这是有道理的,因为它也用于管道。

如何获取包含“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.

如果你的 shell 不是 bash,可能有类似的方法。看看它的手册页。

答案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 模式匹配手册更多细节。

相关内容