Написание bash-скрипта для создания PNG из SVG с помощью Inkscape из каталога

Я очень новичок в написании сценариев bash и надеюсь, что кто-нибудь сможет мне помочь с этой задачей.

У меня есть каталог, заполненный *.SVG-файлами, и я хочу конвертировать их с помощью Inkscape в PNG с помощью следующей команды:

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

Скрипт также имеет параметр $width и $height. Если указан только один параметр, скрипт должен создать квадратное изображение, где $width=$height

пример

Содержание каталога:

file1.svg
file2.svg
file3.svg

./batchscript.sh 1024 2000

Должен выполнить

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

Должен выполнить

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

Содержание каталога должно выглядеть следующим образом:

file1.svg
file1.png
file2.svg
file2.png
file3.svg
file3.png

3 ответа

Решение

После некоторых исследований я сделал это;)

Вот код для 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

Если у вас есть GNU Parallel, попробуйте это (на основе решения 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

Все новые компьютеры имеют несколько ядер, но большинство программ имеют последовательный характер и поэтому не будут использовать несколько ядер. Однако многие задачи чрезвычайно распараллеливаемы:

  • Запустите одну и ту же программу на нескольких файлах
  • Запустите одну и ту же программу для каждой строки в файле
  • Запустите одну и ту же программу для каждого блока в файле

GNU Parallel - это общий параллелизатор, который позволяет легко запускать задания параллельно на одной и той же машине или на нескольких машинах, к которым у вас есть доступ по ssh.

Если у вас есть 32 различных задания, которые вы хотите запустить на 4 процессорах, прямой способ распараллеливания - запустить 8 заданий на каждом процессоре:

Простое планирование

GNU Parallel вместо этого порождает новый процесс после его завершения - поддерживая процессоры активными и, таким образом, экономя время:

Параллельное планирование GNU

Монтаж

Персональная установка не требует root-доступа. Это можно сделать за 10 секунд, выполнив это:

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

Для других вариантов установки см. http://git.savannah.gnu.org/cgit/parallel.git/tree/README

Учить больше

Смотрите больше примеров: http://www.gnu.org/software/parallel/man.html

Посмотрите вступительные видеоролики: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Просмотрите учебник: http://www.gnu.org/software/parallel/parallel_tutorial.html

Подпишитесь на список рассылки, чтобы получить поддержку: https://lists.gnu.org/mailman/listinfo/parallel

Попробуй это:

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

Первый скрипт проверяет номер параметра и устанавливает переменную width а также height или в случае отсутствия параметров выдает сообщение об ошибке и простую справку по использованию.

Чем, если вы запустите эту команду в каталоге, который содержит файл SVG и выполняет inkscape Команда, как вам нужно.

Другие вопросы по тегам