ImageMagick - Incrementar nomes de arquivos em vários loops for

0

Esta é uma questão Bash sobre como renomear / incrementar nomes de arquivos com uma série de loops 'for'. Eu não entendo o comportamento ...

Trabalhando com o comando ImageMagick convert

Se eu fizer isso com 3 arquivos de origem:

$ convert *.miff dir/%d.miff
$ convert *.miff dir1/%d.miff

Eu obtenho o comportamento esperado, com dir e dir1 contendo os arquivos 0.miff 1.miff 2.miff - esse é o comportamento necessário. No entanto convert lê todas as imagens de origem na memória e absorve recursos (Tente isso com 30 - 40 arquivos grandes de imagem), não necessariamente em ordem estrita de arquivos.

Isto é melhor, arquivo por arquivo, em ordem estrita, para satisfazer o requisito de processamento final, um arquivo de cada vez

$ for var in 'ls -v *.miff'; do convert $var dir/%d.miff; done
$ for var in 'ls -v *.miff'; do convert $var dir1/%d.miff; done

Mas recebo 0.miff 1.miff 2.miff em dir e 3.miff 4.miff 5.miff em dir1

Eu tentei atribuir variáveis diferentes a *.miff e $var para cada loop e usando variações em %d.miff , como $((x++)).miff . Sem alteração - o incremento continua para cima em vez de ser redefinido para '0' em cada loop 'for'.

Procurei uma resposta significativa, mas suspeito que esse seja um comportamento incorporado ao bash e parece estar relacionado ao uso da variável $var .

EDIT # 1

A questão é simplificada para evitar sobrecarregar o leitor, mas existem 4 loops, cada um fazendo coisas diferentes, culminando na recombinação das imagens criadas nos 4 diretórios; da seguinte maneira com o script modificado, a resposta de Jesse_p :

x=(0)    
for i in 'ls -v *.miff'; do 
  convert "$i" -depth $depth -roll +0+0 -sample 50% B/"$((x++)).miff"
done

x=(0)    
for i in 'ls -v *.miff'; do 
  convert "$i" -depth $depth -roll +0+1 -sample 50% G/"$((x++)).miff"
done

x=(0)    
for i in 'ls -v *.miff'; do
  convert "$i" -depth $depth -roll +1+0 -sample 50% g/"$((x++)).miff"
done    

x=(0)    
for i in 'ls -v *.miff'; do 
  convert "$i" -depth $depth -roll +1+1 -sample 50% R/"$((x++)).miff"
done

for ((R=0,G=0,g=0,B=0;R<=101;R+=1,G+=1,g+=1,B+=1)); do
  convert R/$R.miff G/$G.miff B/$B.miff depth $depth \
     -colorspace sRGB -combine "$((x++))_$name.tiff"    
done
    
por George Cheshire 21.07.2018 / 23:59

1 resposta

1

De acordo com a documentação do do ImageMagick, você pode usar -scene para definir o número de seqüência inicial (V6.2 e acima):

Dito isto, como ilkkachu aponta e meus testes confirmaram, seus loops irão sobrescrever continuamente um arquivo chamado 0.miff e não incrementar nada. Você pode criar arquivos incrementados com o seguinte:

x=0
for file in *.miff; do convert "$file" "dir/$((x++)).miff"; done
x=0
for file in *.miff; do convert "$file" "dir1/$((x++)).miff"; done

x=0 atribui o valor de 0 à variável chamada x .

$((x++)) aumentará o valor de x após a operação atual. Então, ao executar um, ele será 0.miff, depois 1.miff, etc. Chamaremos x=0 novamente entre os loops para garantir que voltemos a 0 na próxima execução.

note que é melhor globar arquivos (* .miff) do que analisar ls

    
por 22.07.2018 / 00:24