bash extglob 范围或值匹配相同的文件名两次

标签 bash glob extglob

鉴于这些文件:

$ ls
file1  file2  file21  file3  fileFoo

我期待这种通配模式(启用 extglob 的 bash):

$ ls file?({1..2}|Foo)

输出:

file1  file2  fileFoo

但是我得到的是 fileFoo 列出了两次:

$ ls file?({1..2}|Foo)
file1  file2  fileFoo  fileFoo

“或”的两边都不会产生意想不到的结果:

$ ls file?({1..2})
file1  file2

$ ls file?(Foo)
fileFoo

那么为什么当我“或”表达式时 fileFoo 打印两次以及匹配范围的正确通配模式是什么(例如上面的 1-2 但可以是 17-593 或任何其他范围)或其他一些不相关的字符串(例如上面的 Foo)?

$ bash --version
GNU bash, version 4.4.12(3)-release (x86_64-unknown-cygwin)

最佳答案

扩展在 globbing 之前执行:

file?({1..2}|Foo) 

成为

file?(1|Foo) file?(2|Foo)

然后两个参数都被通配。

仅使用如下扩展按预期工作,但会绊倒 nullglob 等:

file{{1..2},Foo}

关于bash extglob 范围或值匹配相同的文件名两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44424626/

相关文章:

javascript - 如何在 fs.existsSync 或 statSync 或 readFileSync 内部使用通配符

regex - Bash 扩展全局模式否定在参数替换中不起作用

bash 方法,便于调用带有大量参数的二进制文件

python - python 在 bash 中可以像这样吗?

linux - bash,将终端输出重置为以前的样子

python - 如何根据另一个包含通配符的列表过滤列表?

bash - bash 扩展 glob 中的否定不起作用

linux - Vagrant 添加到 PATH

linux/tmp 文件夹 + 如何知道文件是否会在重启后或一段时间后被删除