Por que “cat {foo}” não imprime foo, mas “cat {foo, bar}” faz?

12

Eu estava tentando concatenar arquivos de texto em subpastas e tentei:

cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1}/book.txt > out$var

No entanto, isso não retornou nada. Então, tentei adicionar uma 'subpasta 2' não existente

cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1,subfolder2}/book.txt > out$var

E desta vez deu certo, concatenando os arquivos com sucesso. Por que isso acontece?

    
por CDPF 19.05.2018 / 08:39

3 respostas

21

{subfolder1} é avaliado como {subfolder1} , pois não há alternativas. Use subfolder1 em vez disso.

    
por 19.05.2018 / 08:45
20

Por definição, a expansão de chaves no GNU Bash requer uma expressão de seqüência ou uma série de valores separados por vírgula:

Patterns to be brace expanded take the form of an optional preamble, followed by either a series of comma-separated strings or a sequence expression between a pair of braces, followed by an optional postscript.

Você pode ler o manual para obter detalhes.

Algumas amostras simples:

echo {subfolder1}
{subfolder1}

echo {subfolder1,subfolder2}
subfolder1 subfolder2

echo subfolder{1}
subfolder{1}

echo subfolder{1..2}
subfolder1 subfolder2
    
por 19.05.2018 / 08:56
1

Os aparelhos só se expandirão se tiverem cadeias separadas por coma, por exemplo {abc, def} ou intervalo, por ex. {a..e} especificado entre eles.

No seu caso, você pode simplesmente escrever a subpasta1 sem colocá-la entre chaves, pois não há necessidade disso

cat ./{mainfolder1,mainfolder2,mainfolder3}/subfolder1/book.txt > out$var
    
por 19.05.2018 / 18:54