【问题标题】:Execute ImageMagick convert in subfolders with Bash script使用 Bash 脚本在子文件夹中执行 ImageMagick 转换
【发布时间】:2014-06-12 05:54:26
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: bash shell imagemagick imagemagick-convert


    【解决方案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 将扩展为提供给 Bash 的参数,即find 找到的目录。 exit 在这里是作为一种安全措施,以防cd 在那里:您不希望在这种情况下执行随机命令。
    • shopt -s nullglob:如果没有匹配项,glob 将扩展为空。如果存在没有以.jpg 结尾的文件名的子目录,则很有用。
    • 在当前目录中以.jpg结尾的所有文件名构建一个数组f。如果没有此类文件,则此数组为空(感谢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"
    

    【讨论】:

    • 这行得通,非常感谢。我有一个问题: 1. 我不明白你所说的我的 'echo ${PWD##*/}.pdf' 是错误的,因为它有效。你能解释一下吗?对于任何遵循将其放入脚本中的人,只需将其粘贴在一行“#!/bin/bash”之后,它就可以正常工作了。
    • @Jack 添加了一条关于为什么您的回声部分错误的小注释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 2017-08-03
    • 2011-09-22
    • 2023-03-09
    • 2019-11-13
    • 1970-01-01
    • 2019-06-04
    相关资源
    最近更新 更多