ImageMagick的执行与bash脚本转换的子文件夹(Execute ImageMagick c

2019-10-20 00:29发布

我有多个系列的JPEG文件。 每个系列都在它自己的文件夹中。 我想每个系列转换成单一的PDF。 我还要PDF中具有相同的名称,因为它是在文件夹中。

要做到这一点每个文件夹,我可以使用下面的命令,在命令行:

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

我想从顶层文件夹一个bash脚本做到这一点。

Answer 1:

您可能需要使用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将扩展为给猛砸,即通过发现目录中的论点find 。 该exit是这里作为一个安全的情况下,这是不可能cd在那里:你不希望有在这种情况下执行随机命令。
  • shopt -s nullglob :如果没有匹配,则水珠扩大到什么。 有用的,如果有与没有结尾的文件名的子目录.jpg
  • 建立一个数组f所有的文件名的在当前目录与结尾的文件名.jpg 。 如果没有这样的文件(感谢这个数组是空的nullglob外壳选项)。
  • 如果阵列f非空,执行命令:

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

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

我把一个echo前面convert ,所以实际执行的是什么; 该命令会显示在标准输出,为您目视检查,如果一切正常,你期望的那样。 如果是这种情况,只是删除了echo


你问在注释:你为什么说下面一行是错误的?

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

你甚至可以说,因为它的工作为了工作是正确的不是计算机科学等。 在它的工作原理句话应该在充分下面的形式来理解: 它的工作原理,直到它失败 。 其中失败最明显的例子是,如果该目录名称包含空格:想象的目录名hello world然后再转换会看到hello作为自己的一个参数,并world.pdf作为最后一个参数。 很可能不是你想要的。 此外,以下是正确的(和更短,更容易理解):

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


文章来源: Execute ImageMagick convert in subfolders with Bash script