Use variável dentro da expansão da chave bash [duplicata]

1

Eu tenho um programa que gera um número variável de imagens, ordenadas assim: 1.jpg, 2.jpg [...] 10.jpg..etc

Eu não posso usar *.jpg como entrada porque os 10 serão processados antes de 2, 3, etc., então eu quero usar:

convert page_{1..$N}.jpg out.pdf

mas não funciona. Como deve ser o comando?

    
por Smeterlink 31.12.2017 / 00:00

3 respostas

5

Você pode armazenar os nomes dos arquivos em uma matriz, gerando-os com seq :

pages=( $(printf 'page_%d.jpg\n' $(seq $N)) )
convert "${pages[@]}" out.pdf
    
por 31.12.2017 / 01:17
4

Como a expansão da chave é executada anterior à substituição da variável, {1..$n} não funcionará como se deseja e há boas razões para evitar eval . Uma solução simples é corrigir os nomes dos arquivos para que eles ordenem em ordem.

Considere estes arquivos:

$ ls
page_10.jpg  page_1.jpg  page_2.jpg  page_3.jpg  page_4.jpg  page_5.jpg  page_6.jpg  page_7.jpg  page_8.jpg  page_9.jpg

Ao prefixar zeros aos nomes de arquivo de dígito único, podemos fazer com que eles classifiquem como você deseja:

$ for f in ./page_[0-9].jpg; do mv "$f" "./page_0${f#./page_}"; done
$ ls
page_01.jpg  page_02.jpg  page_03.jpg  page_04.jpg  page_05.jpg  page_06.jpg  page_07.jpg  page_08.jpg  page_09.jpg  page_10.jpg

Agora você pode usar:

convert *.jpg out.pdf

Convertendo 2 dígitos para 3

Como smeterlink aponta, o acima pode ser estendido para converter 2 dígitos para 3:

for f in ./page_[0-9][0-9].jpg; do mv "$f" "./page_0${f#./page_}"; done

Como exemplo e usando os arquivos acima:

$ for f in ./page_[0-9][0-9].jpg; do mv "$f" "./page_0${f#./page_}"; done
$ ls
page_001.jpg  page_002.jpg  page_003.jpg  page_004.jpg  page_005.jpg  page_006.jpg  page_007.jpg  page_008.jpg  page_009.jpg  page_010.jpg
    
por 31.12.2017 / 00:34
2

A expansão de contraventamento é realizada antes da substituição de variáveis, portanto, você precisa de eval se desejar o contrário:

eval convert page_{1..$N}.jpg out.pdf

Uma alternativa é classificar os nomes de arquivos expandidos:

convert $(echo page_*.jpg | tr ' ' '\n' | sort -n -k 2 -t _) out.pdf
    
por 31.12.2017 / 00:34