如果匹配中存在重叠,大括号扩展可以生成文件名的多个实例。
一个简单的例子:
mkdir testdir; cd testdir
touch abcd
for f in *{b,c}*; do something_to "$f"; done
# or more simply:
ls -l *{b,c}*
这是一个非常简单的示例,仅供说明之用。在这种情况下,单个文件abcd
将被处理(或列出)两次。
如何最好地删除该列表的重复数据?
- 可以使用关联数组。
- 可以使用精心设计的 glob/brace 扩展,但这并不健壮。
答案1
是的,
for f in *{b,c}*
首先扩展为:
for f in *b* *c*
然后循环遍历这两个 glob 的独立扩展。
你想要的是一团。在这里,*[bc]*
可以,但是对于更复杂的情况,在 中bash
,您需要启用类似 ksh 的扩展 glob。您可能还需要 nullglob 选项:
shopt -s nullglob extglob
for f in *@(b|c)*; do...
在zsh
:
for f in *(b|c)*(N); do
(N)
每个 glob 的存在nullglob
。
在ksh93
:
for f in ~(N)*@(b|c)*; do