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
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?
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
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
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
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