web-dev-qa-db-fra.com

Écrire un script bash pour créer des PNG à partir de SVG avec Inkscape à partir d'un répertoire

Je suis très novice en scripting et j'espère que quelqu'un pourra m'aider dans cette tâche.

J'ai un répertoire rempli de fichiers * .SVG et je souhaite les convertir par lots avec inkscape en PNG à l'aide de la commande suivante:

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

Le script a également un paramètre $ width et $ height. Si un seul paramètre est donné, le script doit créer une image carrée où $ width = $ height

Exemple

Contenu du répertoire:

file1.svg
file2.svg
file3.svg

./batchscript.sh 1024 2000

Devrait effectuer

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

Devrait effectuer

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

Le contenu du répertoire devrait ressembler à ceci:

file1.svg
file1.png
file2.svg
file2.png
file3.svg
file3.png
2
Robert Kresse

Après quelques recherches je l'ai fait;)

Voici le code pour 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 "$1" ]
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 "$2" ] 
then
#echo -en 'Processing file '$c' of '$indir'\e[5m...'
c="0";
for file in *.svg
do
     /usr/bin/inkscape -z -f "${file}" -w $1 -h $1 -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 $1 -h $2 -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
2
Robert Kresse

Si vous avez GNU Parallel, essayez ceci (basé sur la solution de Letizia):

#!/bin/bash

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

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

Tous les nouveaux ordinateurs ont plusieurs cœurs, mais la plupart des programmes sont de type série et n'utiliseront donc pas les cœurs multiples. Cependant, de nombreuses tâches sont extrêmement parallèles:

  • Exécuter le même programme sur plusieurs fichiers
  • Exécuter le même programme pour chaque ligne d'un fichier
  • Exécuter le même programme pour chaque bloc d'un fichier

GNU Parallel est un paralléliseur général. Il est facile d’exécuter des tâches en parallèle sur la même machine ou sur plusieurs machines auxquelles vous avez accès ssh.

Si vous souhaitez exécuter 32 tâches différentes sur 4 processeurs, une méthode simple pour paralléliser consiste à exécuter 8 tâches sur chaque processeur:

Simple scheduling

Au lieu de cela, GNU Parallel génère un nouveau processus, ce qui permet de garder les processeurs actifs et de gagner du temps:

GNU Parallel scheduling

Installation

Une installation personnelle ne nécessite pas d'accès root. Cela peut être fait en 10 secondes en faisant ceci:

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

Pour d'autres options d'installation, voir http://git.savannah.gnu.org/cgit/parallel.git/tree/README

En savoir plus

Voir plus d'exemples: http://www.gnu.org/software/parallel/man.html

Regardez les vidéos d'introduction: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Parcourez le didacticiel: http://www.gnu.org/software/parallel/parallel_tutorial.html

Inscrivez-vous à la liste de diffusion pour obtenir de l'aide: https://lists.gnu.org/mailman/listinfo/parallel

4
Ole Tange

Essaye ça:

#!/bin/bash
if [ $# -eq 1 ]; then
   width=$1
   height=$1
else
  if [ $# -eq 2 ]; then
     width=$1
     height=$2
  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

Le premier script vérifie le nombre de paramètres et définit la variable width et height ou, en cas de paramètres manquants, envoie un message d'erreur et une aide simple à l'utilisation.

En supposant que vous exécutiez cette commande dans un répertoire contenant le fichier svg et exécutant la commande inkscape selon vos besoins.

2
Lety