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

标签 bash shell imagemagick imagemagick-convert

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

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

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

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

最佳答案

您可能需要使用 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:如果没有匹配项,则 glob 会扩展为空。如果子目录中的文件名不以 .jpg 结尾,则很有用。
  • 构建当前目录中所有文件名的数组f,文件名以.jpg结尾。如果没有此类文件,则该数组为空(感谢 nullglob shell 选项)。
  • 如果数组f非空,则执行命令:

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

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

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


您在评论中问:为什么说下面这行是错误的?

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

你甚至说因为它有效工作正确在计算机科学中并不相同。 it Works 句子应该按以下完整形式来理解:it Works Until it Failure。最明显的失败情况是目录名称包含空格:想象一个目录名称 hello world 然后 Convert 会将 hello 视为其自身的参数,并且 world.pdf 作为最后一个参数。很可能不是你想要的。此外,以下是正确的(并且更短且更容易理解):

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

关于bash - 使用 Bash 脚本在子文件夹中执行 ImageMagick 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23311384/

相关文章:

macos - 覆盖 bash PS1 不起作用

php - imagick php 7.2 没有设置 webp 格式

linux - 使用 jq 插入字符串

linux - 获取按时间排序的文件名

python - 如何在 python 脚本中从 .env 文件设置环境变量?

java - 在tomcat7上运行shell脚本

php - 可扩展的异步图像大小调整

ruby - 如何修改图像的颜色以消除活力?

bash - 如何在bash中使用变量名生成for循环序号?

javascript - Webpack 捆绑客户端特定组件