expansão da chave de aninhamento e substituição de comando

2

Eu quero criar um script bash simples que verifique se um diretório contém todos os arquivos cujos nomes contenham 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 o uso do comando seq 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

Entendo que executar o comando cercando o caminho com aspas simples deve levar ao erro, pois os curingas não se expandem

$ ls 'test/*{01,02}*'

Mas eu não os usei. Qual é o problema?

    
por ka3ak 20.10.2018 / 16:22

1 resposta

7

O problema é que o shell executará a expansão de chaveta (que processa {...,...} ) antes de fazer a substituição de comando (a $(...) part.) Então, depois que seu seq for expandido, o shell não reavaliará o {01,02} e vai deixar como literal.

Você precisa adicionar um eval para reavaliar a expressão após a substituição do comando:

$ eval "ls test/*{$(seq -s , -f "%02g" 1 2)}*"

Nesse caso, a substituição do comando será executada primeiro, resultando em uma string ls test/*{01,02}* e o eval solicitará que o shell interprete isso como um comando, que executará a expansão de chave e glob, resultando em a lista de arquivos que você está esperando.

    
por 20.10.2018 / 17:14

Tags