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
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
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:
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:
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:
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
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.