Bash 文件名扩展:避免某些字符

Bash 文件名扩展:避免某些字符

在 Bash 中,我可以Foo1.png通过Foo9.png使用Foo[0-9].png.我可以避免Foo5.png使用Foo[1-46-9].png.有没有办法指定一系列排除十进制数字?

例如,如果我想排除Foo3.pngand Foo7.png,我可以使用Foo[0-24-689],但我会找到一个Foo[^37].png更容易阅读的模式。这是 Vim 语法,Bash 不会解释它(不包括3和 )7。但我想知道 Bash 在其文件名扩展中是否有字符排除模式。

如果有匹配的解决方案全部3或之外的单个字符7,在某些情况下也会有帮助(例如引发此问题的特定字符,尽管上面的描述过于简化)。

答案1

shellbash理解类似正则表达式的Foo[^37].png模式和标准 shell 模式Foo[!37].png,因此您可以毫无问题地使用它们,除非您有其他需要排除的名称类似Food.png或等的文件。Fool.png

如果Foo[^37].png在您的脚本中没有按预期工作,那么这表明您没有使用bash,而是使用其他 shell,例如(可能在非 GNU 系统上?)您是否在命令行上dash运行了脚本?sh如果是这样,请不要这样做,并#!在脚本中使用正确的 -line 指向正确的 shell 解释器。

假设您想要排除类似的名称Food.png,以确保后面跟有Foo数字,然后.png使用Foo[0-9].png。要从其中排除Foo3.png和,请分别测试它们。Foo7.png

for name in Foo[0-9].png; do
    case $name in (*[37].png) continue; esac

    # process "$name" here
done

或者,使用bash语法,

for name in Foo[0-9].png; do
    [[ $name == *[37].png ]] && continue

    # process "$name" here
done

正如 Stéphane Chazelas 在下面的评论中提到的,您可以使用扩展的通配模式来bash测试3和以外的数字7。使用 启用扩展通配模式shopt -s extglob,然后使用该模式

Foo!(!([0-9])|[37]).png

但对我个人来说,Foo[01245689].png在决定我相信这个表达式正在做正确的事情(它做)。

相关内容