使用Bash脚本在子文件夹中执行ImageMagick转换

时间:2014-04-26 13:12:42

标签: bash shell imagemagick imagemagick-convert

我有多个jpeg系列。每个系列都在自己的文件夹中。我希望将每个系列转换为单个pdf。我希望pdf与它所在的文件夹具有相同的名称。

要在每个文件夹的命令行中执行此操作,我可以使用以下命令:

convert *.jpg `echo ${PWD##*/}`.pdf

我想使用bash脚本从顶级文件夹中执行此操作。

1 个答案:

答案 0 :(得分:3)

您可能希望使用find

find . -type d -exec bash -c 'cd "$0" || exit; shopt -s nullglob; f=( *.jpg ); ((${#f[@]})) && echo convert "${f[@]}" "${PWD##*/}.pdf"' {} \;

这将递归到每个子目录中,并为每个子目录执行Bash命令:

cd "$0" || exit
shopt -s nullglob
f=( *.jpg )
((${#f[@]})) && echo convert "${f[@]}" "${PWD##*/}.pdf"
  • $0将扩展为给予Bash的参数,即find找到的目录。 exit在这里是安全的,以防cd无法在那里:你不想在这种情况下执行随机命令。
  • shopt -s nullglob:如果没有匹配,则全局扩展为空。如果存在没有以.jpg结尾的文件名的子目录,则非常有用。
  • 构建当前目录中所有文件名的数组f,文件名以.jpg结尾。如果没有这样的文件,这个数组是空的(感谢nullglob shell选项)。
  • 如果数组f非空,请执行以下命令:

    echo convert "${f[@]}" "${PWD##*/}.pdf"
    

    (顺便说一句,echo ${PWD##*/}.pdf 错误,见下文)。

我在echo前放了一个convert,以便实际上没有执行任何操作;该命令显示在标准输出上,供您直观地检查一切是否按预期工作。如果是这种情况,请删除echo


您在评论中提到:为什么您说以下行是错误的?

convert *.jpg `echo ${PWD##*/}`.pdf

你甚至说因为它有效工作是正确的在计算机科学中并不相同。 it works 句子应该以完整的下列形式理解:它可以工作直到失败。失败的最明显的情况是目录名称包含空格:假设目录名称为hello world然后转换将hello作为参数自己,world.pdf作为最后一个论点。很可能不是你想要的。此外,以下是正确的(更短更容易理解):

convert *.jpg "${PWD##*/}.pdf"