编写一个 bash 脚本,使用 Inkscape 从目录中的 SVG 创建 PNG

编写一个 bash 脚本,使用 Inkscape 从目录中的 SVG 创建 PNG

我对 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

答案1

如果您有 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 访问的多台机器上并行运行作业。

如果你想在 4 个 CPU 上运行 32 个不同的作业,那么并行化的直接方法是在每个 CPU 上运行 8 个作业:

简单调度

当一个进程完成时,GNU Parallel 会生成一个新进程 - 保持 CPU 活跃,从而节省时间:

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

答案2

尝试这个:

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

第一个脚本检查参数的数量并设置变量widthheight如果缺少参数,则会抛出错误消息和简单的使用帮助。

假设您在包含 svg 文件的目录中运行此命令并inkscape根据需要执行命令。

答案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

相关内容