删除重复的 Bash 支撑扩展

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将被处理(或列出)两次。

如何才能最好地消除此列表的重复数据?

  • 可以使用关联数组。
  • 可以使用精心设计的 glob/brace 扩展,但这并不健壮。

Sté*_*las 6

是的,

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)