extglob
Bash中扩展 glob ( ) 的解决方案:
bash -c $'shopt -s extglob \n /bin/ls -1U <ext-glob-pattern>'
如果至少有一个匹配项,则退出状态为 0,如果没有匹配项,则退出状态为非零 (2)。标准输出包含一个以换行符分隔的匹配文件列表(以及包含空格的文件名,它们被引用)。
或者,略有不同:
bash -c $'shopt -s extglob \n compgen -G <ext-glob-pattern>'
与ls
基于 - 的解决方案的差异:可能更快(未测量),输出中未引用空格的文件名,不匹配时退出代码 1(不是 2 :shrug:)。
示例用法:
没有匹配:
$ bash -c $'shopt -s extglob \n /bin/ls -1U @(*.foo|*.bar)'; echo "exit status: $?"
/bin/ls: cannot access '@(*.foo|*.bar)': No such file or directory
exit status: 2
至少一场比赛:
$ bash -c $'shopt -s extglob \n /bin/ls -1U @(*.ts|*.mp4)'; echo "exit status: $?"
'video1 with spaces.mp4'
video2.mp4
video3.mp4
exit status: 0
使用的概念:
ls
' 退出代码行为(增加-U
效率和输出-1
控制)。
- 不在
extglob
当前 shell 中启用(通常不需要)。
- 使用
$
前缀以便\n
解释 ,以便扩展 glob 模式与 -- 位于不同的行上,shopt -s extglob
否则扩展 glob 模式将是语法错误!
注意 1:我致力于此解决方案,因为compgen -G "<glob-pattern>"
其他答案中建议的方法似乎不适用于大括号扩展;但我需要一些更高级的通配符功能。
注 2:扩展 glob 语法的可爱资源:extglob