Expansões de cunhas de eliminação de duplicadores

4

As expansões de chaves podem produzir várias instâncias de nomes de arquivos se houver uma sobreposição nas correspondências.

Um exemplo simples:

mkdir testdir; cd testdir
touch abcd
for f in *{b,c}*; do something_to "$f"; done
# or more simply:
ls -l *{b,c}*

Esse é um exemplo muito simplificado apenas para ilustração. Nesse caso, o arquivo único abcd seria processado (ou listado) duas vezes.

Como essa lista pode ser melhor desduplicada?

  • Uma matriz associativa pode ser usada.
  • Uma expansão glob / brace cuidadosamente criada pode ser usada, mas isso não é robusto.
por Dennis Williamson 10.03.2016 / 17:58

1 resposta

5

Sim,

for f in *{b,c}*

é expandido primeiro para:

for f in *b* *c*

E, em seguida, o loop é executado sobre a expansão independente desses dois globs.

O que você quer aqui é um glob. Aqui, *[bc]* faria, mas para algo mais complexo, em bash , você precisaria ativar globs estendidos semelhantes a ksh. Você provavelmente também desejará a opção nullglob:

shopt -s nullglob extglob
for f in *@(b|c)*; do...

Em zsh :

for f in *(b|c)*(N); do

O (N) sendo para um per-glob nullglob .

Em ksh93 :

for f in ~(N)*@(b|c)*; do
    
por 10.03.2016 / 18:09