
Preciso converter vários .rgb
arquivos em .png
s (cada arquivo deve manter seu nome original).
Quero descobrir como converter o primeiro arquivo e depois agrupar o comando em um loop 'for'.
Isso é o que eu tenho até agora:
find . -name "*.rgb" | sort | sed -n \1\p | xargs convert zzzzz.png
Mas isso não funciona.
Como posso fazer o convert
comando reconhecer o segundo argumento zzzzz.png
?
Responder1
Se você quiser converter todos os arquivos na árvore dir, eu executaria:
find . -name '*.rgb' | parallel convert {} {.}.png
Isso será executado em paralelo:
convert ./foo.rgb ./foo.png
convert ./bar/quux.rgb ./bar/quux.png
Aqui eu uso o GNU Parallel para aproveitar todas as suas CPUs. Dependendo do seu sistema você pode instalá-lo como um pacote, caso contrário está aquignu.org/software/parallel. No Debian é:
apt-get install parallel
Editar:
Aqui está uma solução sem GNU Parallel
:
find . -name '*.rgb' -exec sh -c 'convert "$0" "${0%.*}.png"' {} \;
e uma solução não tão boa usando while..read
:
find . -name '*.rgb' | while read FILE; do convert "${FILE}" "${FILE%rgb}png" ; done
Responder2
Para converter (no meu caso redimensionar) todas as imagens em um único diretório eu uso
ls *.jpg | xargs -I {} convert {} -resize 1024x768 resized/{}
Observe como o espaço reservado para chaves para o nome do arquivo pode ser usado duas vezes. Você também pode usá-lo para adicionar um prefixo ao nome do arquivo de destino.
Para pesquisa recursiva:
find -name '*.jpg' | xargs -I {} convert {} -resize 1024x768 resized/{}
Responder3
Encontrei a resposta:
for i in 'seq 1 $numOfRGBfiles'; do
#Insert code here that finds the file
#name of each rgb file and stores it
#in $filename.
'find . -name "*.rgb" | sort | sed -n
\$i\p | xargs -I {} convert {}
\$filename.png'
done