Escrevendo um script bash para criar PNGs a partir do SVG com o Inkscape a partir de um diretório

2

Sou muito novo no bash scripting e espero que alguém possa me ajudar com essa tarefa.

Eu tenho um diretório cheio de arquivos * .SVG e quero convertê-los em lote com o inkscape para PNG com o seguinte comando:

inkscape -f FILENAME.svg -w WIDTH -h HEIGHT -e FILENAME.png

O script também tem um parâmetro $ width e $ height. Se apenas um parâmetro for fornecido, o script deve criar uma imagem quadrada em que $ width = $ height

Exemplo

Conteúdo do diretório:

file1.svg
file2.svg
file3.svg

./batchscript.sh 1024 2000

Deve executar

inkscape -f file1.svg -w 1024 -h 2000 -e file1.png
inkscape -f file2.svg -w 1024 -h 2000 -e file2.png
inkscape -f file3.svg -w 1024 -h 2000 -e file3.png
./batchscript.sh 3000

Deve executar

inkscape -f file1.svg -w 3000 -h 3000 -e file1.png
inkscape -f file2.svg -w 3000 -h 3000 -e file2.png
inkscape -f file3.svg -w 3000 -h 3000 -e file3.png

O conteúdo do diretório deve ficar assim:

file1.svg
file1.png
file2.svg
file2.png
file3.svg
file3.png
    
por Robert Kresse 14.09.2014 / 15:08

3 respostas

2

Depois de algumas pesquisas eu fiz isso;)

Aqui está o código para svg2png.sh

#!/bin/sh
# Saves all *.svg as *.png
# Check if SVG files are in this folder else exit
indir=$(ls -1 *.svg | wc -l)>/dev/null 2>&1;
if [ "$indir" -gt "0" ]
then
# Check if width-parameter is given else state an error and exit
if [ -z "" ]
then
echo 'Script usage: ./svg2png width [height]';
echo 'Where [height] is optional. If not given [height] = width';
exit;
>&2; 
exit 1;
fi

# Check if height-parameter is given. If yes: $height=$height If not: $height=$width and process all *.svg-files in the directory.

if [ -z "" ] 
then
#echo -en 'Processing file '$c' of '$indir'\e[5m...'
c="0";
for file in *.svg
do
     /usr/bin/inkscape -z -f "${file}" -w  -h  -e "${file}.png" >/dev/null 2>&1;
     echo -en "\r$i\e[0m";
     echo -en 'Processing file '$c' of '$indir'\e[5m...'
     ((c = c + 1));
done

else
c="0";
for file in *.svg
do
     /usr/bin/inkscape -z -f "${file}" -w  -h  -e "${file}.png" >/dev/null 2>&1;
     echo -en "\r$i\e[0m";
     echo -en 'Processing file '$c' of '$indir'\e[5m...'
     ((c = c + 1));
done
fi
# Output success message
echo -en "\r$i";
echo '\e[0m\e[1mSuccess: '$c' files have been processed!'

# When there are no SVG files to process abort script
else
echo -e "There are no SVG files to process. Aborting.";
fi
    
por Robert Kresse 14.09.2014 / 16:13
3

Se você tem o GNU Parallel, tente isto (baseado na solução da Letizia):

#!/bin/bash

if [ $# -eq 1 ]; then
   width=
   height=
else
  if [ $# -eq 2 ]; then
     width=
     height=
  else
     echo "Error: missing parameters!"
     echo "Usage: myscript.sh width [height]"
     exit 1
  fi
fi

parallel inkscape -f {} -w $width -h $height -e {.} ::: *.svg

Todos os novos computadores têm vários núcleos, mas a maioria dos programas são de natureza serial e, portanto, não usam os vários núcleos. No entanto, muitas tarefas são extremamente paralelizáveis:

  • Execute o mesmo programa em muitos arquivos
  • Execute o mesmo programa para cada linha em um arquivo
  • Execute o mesmo programa para cada bloco em um arquivo

O GNU Parallel é um paralelizador geral e facilita a execução de trabalhos em paralelo na mesma máquina ou em várias máquinas para as quais você tem acesso ssh.

Se você tem 32 tarefas diferentes que você quer rodar em 4 CPUs, uma forma direta de paralelizar é rodar 8 tarefas em cada processador:

O

GNU Parallel gera um novo processo quando um termina - mantendo as CPUs ativas e economizando tempo:

Instalação

Uma instalação pessoal não requer acesso root. Isso pode ser feito em 10 segundos ao fazer isso:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

Para outras opções de instalação, consulte o link

Saiba mais

Veja mais exemplos: link

Assista aos vídeos de introdução: link

Percorra o tutorial: link

Inscreva-se na lista de e-mail para obter suporte: link

    
por Ole Tange 15.09.2014 / 08:08
2

Tente isto:

#!/bin/bash
if [ $# -eq 1 ]; then
   width=
   height=
else
  if [ $# -eq 2 ]; then
     width=
     height=
  else
     echo "Error: missing parameters!"
     echo "Usage: myscript.sh width [height]"
     exit 1
  fi
fi

ls *.svg | while read file
        do
           destFile='echo $file | sed 's/\.svg/\.png/''
           inkscape -f $file -w $width -h $height -e $destFile
        done
exit 0

Primeiro script, verifique o número do parâmetro e defina a variável width e height ou, em caso de parâmetros ausentes, uma mensagem de erro e uma ajuda de uso simples são exibidas.

Suponha que você execute este comando no diretório que contém o arquivo svg e execute o comando inkscape conforme necessário.

    
por Lety 14.09.2014 / 16:30