Listar arquivos numerados usando sequência curinga com intervalo predefinido

1

Eu tenho uma pasta de arquivos de dados numerados. Eu estou tentando incrementalmente extrair um intervalo predefinido de arquivos. O intervalo de arquivos que estou procurando é predefinido em duas variáveis, ns e ne, que mudam conforme o código é executado.

Eu tenho tentado algo como o seguinte:

$ ns=0001
$ ne=0030

$ ls foo_{$ns..$ne}.nc

Mas isso não lê {$ns..$ne} como uma sequência e retorna o erro:

ls: cannot access foo_{0001..0030}.nc: No such file or directory

Se eu digitar o mesmo comando, mas com os números digitados manualmente, recebo uma lista de arquivos com números que variam de 0001 a 0030, conforme o esperado.

Eu presumo que estou cometendo um erro fundamental no uso do sequenciamento, mas gostaria que alguém me informasse qual era esse erro.

Muito obrigado.

    
por G. MacGilchrist 24.05.2016 / 17:28

2 respostas

1

A expansão de contraventamento acontece antes da expansão da variável, portanto não há como usar variáveis nela. Você pode usar seq :

seq -f foo_%03.0f.nc $ns $ne
    
por 24.05.2016 / 17:33
0

Note que {1..20} não é um operador de wildcard / globbing. Essa é uma forma especial de expansão de contraventamento introduzida por zsh e copiada com limitações e variações por ksh93 e bash .

foo_{0001..0030}.nc não se expande para a lista de arquivos correspondentes, ele expande para foo_0001.nc , foo_0002.nc , ... foo_0030.nc , independentemente de os arquivos existirem ou não.

bash tem essa limitação de que o conteúdo não pode ser variável. ksh93 e zsh não têm essa limitação.

Portanto, ls -d foo_{$ns..$ne}.nc funcionará nesses shells.

zsh também tem um operador globbing / curinga para corresponder aos intervalos de números decimais.

ls -d foo_<1-30>.nc

Expandirá para a lista de arquivos correspondentes. Se você quiser limitá-lo a 4 algarismos 0 dígitos, você precisaria de outro operador:

ls -d foo_(<1-30>~^????).nc # needs extendedglob

( ~ é exceto ( e-não ), ^ não é , então ~^ é e não não , então e ).

O operador <x-y> não funciona com variáveis (porque ele se sobrepõe a operadores de redirecionamento, ele só funciona ao seguir o padrão <[digits]-[digits]> para evitar conflitos com redirecionamentos, tanto quanto possível). No entanto, você pode usar essa sintaxe para contornar:

ls -d ${~:-foo_<$ns-$ne>.nc}

Ou mais legivelmente:

pattern="foo_<$ns-$ne>.nc"
ls -d $~pattern
    
por 24.05.2016 / 18:01