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