删除重复的 Bash 大括号扩展

删除重复的 Bash 大括号扩展

如果匹配中存在重叠,大括号扩展可以生成文件名的多个实例。

一个简单的例子:

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

相关内容