我有多个系列的 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/