Den*_*son 4 bash wildcards brace-expansion
如果匹配中存在重叠,大括号扩展可以产生文件名的多个实例。
一个简单的例子:
mkdir testdir; cd testdir
touch abcd
for f in *{b,c}*; do something_to "$f"; done
# or more simply:
ls -l *{b,c}*
Run Code Online (Sandbox Code Playgroud)
这是一个非常简化的示例,仅用于说明。在这种情况下,单个文件abcd将被处理(或列出)两次。
如何才能最好地消除此列表的重复数据?
是的,
for f in *{b,c}*
Run Code Online (Sandbox Code Playgroud)
首先扩展为:
for f in *b* *c*
Run Code Online (Sandbox Code Playgroud)
然后循环遍历这两个 glob 的独立扩展。
你在这里想要的是一团。在这里,*[bc]*可以,但对于更复杂的事情,在 中bash,您需要启用类似 ksh 的扩展全局。您可能还需要 nullglob 选项:
shopt -s nullglob extglob
for f in *@(b|c)*; do...
Run Code Online (Sandbox Code Playgroud)
在zsh:
for f in *(b|c)*(N); do
Run Code Online (Sandbox Code Playgroud)
该(N)是对每个水珠nullglob。
在ksh93:
for f in ~(N)*@(b|c)*; do
Run Code Online (Sandbox Code Playgroud)