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
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.
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