在 Bash 中,我可以Foo1.png
通过Foo9.png
使用Foo[0-9].png
. 我可以避免Foo5.png
使用Foo[1-46-9].png
. 有没有办法为十进制数字指定一系列排除项?
例如,如果我想排除Foo3.png
and Foo7.png
,我可以使用Foo[0-24-689]
,但我会发现这样的模式Foo[^37].png
更容易阅读。那是 Vim 语法,Bash 不会将其解释为排除3
and 7
。但我想知道 Bash 在其文件名扩展中是否有字符排除模式。
如果有一个解决方案可以匹配除or之外的所有单个字符,那么在某些情况下(例如引发此问题的特定问题,尽管上面的描述过于简化),这也会有所帮助。3
7
bash
shell 既能理解正则表达式模式,也能理解Foo[^37].png
标准 shell 模式Foo[!37].png
,因此您可以毫无问题地使用它们,除非您有其他需要排除的名称如Food.png
or的文件。Fool.png
如果
Foo[^37].png
在您的脚本中没有按预期工作,那么这表明您没有使用bash
,而是使用其他一些 shell,例如dash
(可能在非 GNU 系统上?)您是否sh
在命令行上运行了脚本?如果是这样,请不要,并#!
在脚本中使用正确的 -line 指向正确的 shell 解释器。假设有
Food.png
您想要排除的名称,以确保您Foo
后面跟着一个数字,.png
然后使用Foo[0-9].png
.Foo3.png
然后排除Foo7.png
这些,分别测试这些。或者,使用
bash
语法,正如 Stéphane Chazelas 在下面的评论中提到的,您可以使用扩展的通配符模式
bash
来测试 和 以外的3
数字7
。使用启用扩展的 globbing 模式shopt -s extglob
,然后使用该模式但是我个人在这个答案的前半部分编写脚本会更快(或
Foo[01245689].png
用于那个问题),运行它并完成,然后再决定我相信这个表达式正在做正确的事情(它做)。