首页 > 解决方案 > bash:全局否定和多种模式的问题

问题描述

我正在尝试编写一个 glob 模式,它返回一个不以 2 个可能的后缀之一结尾的文件列表:完成和每月

我的测试目录中的文件列表是:

foo.done
foo.montly
foo.pdf
foo.txt

如果我只对 1 个后缀执行否定,我会非常成功:

ls  !(*done) or ls  !(*monthly)

但是,当我尝试这样的事情时:

ls  !({*monthly,*done})

我明白了:

foo.done
foo.monthly
foo.pdf
foo.pdf
foo.txt
foo.txt

有人可以帮助我理解一个结果,它不仅不会产生我想要的否定结果,而且还会列出重复项!

标签: bashglob

解决方案


用于|分隔模式列表 ( docs ) 中的模式:

如果使用内置 shopt 启用了 extglob shell 选项,则可以识别多个扩展模式匹配运算符。在下面的描述中,模式列表是一个或多个由“|”分隔的模式的列表。

结果:

$ shopt -s extglob

$ ls
foo.done  foo.monthly  foo.pdf  foo.txt

$ ls *.!(monthly|done)
foo.pdf  foo.txt

推荐阅读