com zsh
:
#! /bin/zsh -
typeset -Z3 page
files=(image-<0-3900>.jpg)
for ((page = 1; $#files; page++)) {
convert $files[1,13] -append ./Merged/page_$page.jpg
files[1,13]=()
}
Observe que, como há 3901 imagens (13 × 300 + 1), a última página terá apenas uma imagem.
Você pode fazer algo semelhante com bash
como:
#! /bin/bash -
shopt -s extglob
shopt -s failglob
set -- image-+([[:digit:]]).jpg
for ((page = 1; $#; page++)) {
printf -v padded_page %03d "$page"
convert "${@:1:13}" -append "./Merged/page_$padded_page.jpg"
(($# > 13)) || break
shift 13
}
POSIXly, supondo que haja arquivos correspondentes e fazendo uma verificação ainda menos próxima nos nomes de arquivos:
#! /bin/sh -
set -- image-*.jpg
# disable split+glob, only retain empty removal on unquoted expansions:
set -o noglob; IFS=
page=1; while [ "$#" -gt 0 ]; do
padded_page=000$page
padded_page=${padded_page#"${padded_page%???}"}
convert $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} \
-append "./Merged/page_$padded_page.jpg"
[ "$#" -gt 13 ] || break
shift 13
page=$((page + 1))
done
Note que, enquanto aqui os nomes dos arquivos são muito domados (sem espaços em branco, caracteres especiais ...), cuidados especiais foram tomados nesses códigos para manipular caracteres arbitrários. No entanto, note que convert
e outros utilitários imagemagick podem ter problemas com nomes de arquivos começando com -
(mesmo quando usando --
) ou contendo :
, então o melhor é prefixar caminhos de arquivo com ./
para evitar esses problemas (por exemplo, use ./*.jpg
em vez de *.jpg
).