Eu quero criar um script bash simples que verifica se um diretório contém todos os arquivos cujos nomes contêm números de 1 a N.
# Creating some files for testing
$ cd /tmp/
$ mkdir test
$ touch test/a01x.dat
$ touch test/b02y.dat
# Display dir contents
$ ls test/*{01,02}*
test/a01x.dat test/b02y.dat
Mas usar seq
o comando para gerar números resulta no seguinte:
$ ls test/*{$(seq -s , -f "%02g" 1 2)}*
ls: cannot access 'test/*{01,02}*': No such file or directory
Eu entendo que executar o comando cercando o caminho com aspas simples deve levar ao erro porque os curingas não se expandem
$ ls 'test/*{01,02}*'
Mas eu não os usei. Qual é o problema?
O problema é que o shell fará a expansão de chaves (que processa
{...,...}
) antes de fazer a substituição de comandos (a$(...)
parte) .seq
{01,02}
Você precisa adicionar um
eval
para que ele reavalie a expressão após a substituição do comando ser executada:Nesse caso, a substituição do comando será realizada primeiro, resultando em uma string
ls test/*{01,02}*
eeval
o shell solicitará que o shell interprete isso como um comando, que executará a expansão de chaves e glob, resultando na lista de arquivos que você espera.