我正在尝试使用扩展的 glob bash -c
,但还没有找到让它工作的方法。
我尝试过的事情
bash -c 'for f in *.!(ext); do echo $f; done'
结果:
bash: -c: line 0: syntax error near unexpected token `('
bash -c 'for f in *.!\(ext\); do echo $f; done'
结果:
*.!(ext)
bash -c 'for f in *.!$0; do echo $f; done' '(ext)'
结果:
*.!(ext)
bash -c 'for f in "*.!(ext)"; do echo $f; done'
结果:
*.!(ext)
答案1
要在 中使用扩展的通配模式bash
,您必须extglob
以一种或另一种方式启用 shell 选项。
对于内联脚本执行此操作的最简单方法是使用命令行上的选项bash -c
设置 shell 选项:-O
bash -O extglob -c 'script code here'
您也可以直接致电shopt -s extglob
在脚本内,但您必须确保这是在单独的行上完成的,因为它改变了 shell 解析代码的方式(它修改了 shell 的语法):
bash -c 'shopt -s extglob
script code here'
至于打印所有不以字符串结尾的名称的实际任务.ext
:
bash -O extglob -O dotglob -O nullglob -c 'printf "%s\n" !(*.ext)'
通过另外设置dotglob
和nullglob
选项,脚本将匹配隐藏名称,如果没有匹配,将打印一个空行(而不是打印未展开的模式)。
请注意,您的模式将排除以(不仅仅是)*.!(ext)
结尾的文件名ext
.ext
和不包含点的文件名。