Scrivere uno script bash per creare PNG da SVG con Inkscape da una directory

2

Sono molto nuovo nello script di bash e spero che qualcuno possa aiutarmi con questo compito.

Ho una directory piena di file * .SVG e voglio convertirli in batch con inkscape in PNG con il seguente comando:

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

Lo script ha anche un parametro $ larghezza e $ altezza. Se viene fornito un solo parametro, lo script dovrebbe creare un'immagine quadrata in cui $ width = $ height

Esempio

Contenuto directory:

file1.svg
file2.svg
file3.svg

./batchscript.sh 1024 2000

Dovrebbe eseguire

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

Dovrebbe eseguire

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

Il contenuto della directory dovrebbe apparire come segue:

file1.svg
file1.png
file2.svg
file2.png
file3.svg
file3.png
    
posta Robert Kresse 14.09.2014 - 15:08

3 risposte

2

Dopo alcune ricerche l'ho fatto;)

Ecco il codice per 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
    
risposta data Robert Kresse 14.09.2014 - 16:13
3

Se hai GNU Parallelo, prova questo (basato sulla soluzione di 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

Tutti i nuovi computer hanno più core, ma la maggior parte dei programmi sono di natura seriale e quindi non utilizzeranno più core. Tuttavia, molte attività sono estremamente parallelizzabili:

  • Esegui lo stesso programma su molti file
  • Esegui lo stesso programma per ogni riga in un file
  • Esegui lo stesso programma per ogni blocco in un file

GNU Parallel è un parallelizzatore generale e rende facile eseguire i lavori in parallelo sulla stessa macchina o su più macchine a cui hai accesso SSH.

Se hai 32 lavori diversi che vuoi eseguire su 4 CPU, un modo semplice per parallelizzare è eseguire 8 lavori su ciascuna CPU:

GNU Parallel invece genera un nuovo processo quando si finisce - mantenendo le CPU attive e risparmiando così tempo:

Installazione

Un'installazione personale non richiede l'accesso come root. Può essere fatto in 10 secondi in questo modo:

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

Per altre opzioni di installazione, consulta link

Ulteriori informazioni

Vedi altri esempi: link

Guarda i video introduttivi: link

Segui il tutorial: link

Iscriviti alla mailing list per ottenere supporto: link

    
risposta data Ole Tange 15.09.2014 - 08:08
2

Prova questo:

#!/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

Il primo script controlla il numero del parametro e imposta la variabile width e height o in caso di parametri mancanti genera un messaggio di errore e una semplice guida all'utilizzo.

Supponendo che tu esegua questo comando nella directory che contiene il file svg ed esegua il comando inkscape di cui hai bisogno.

    
risposta data Lety 14.09.2014 - 16:30

Leggi altre domande sui tag