我有多个jpeg系列。每个系列都在自己的文件夹中。我希望将每个系列转换为单个pdf。我希望pdf与它所在的文件夹具有相同的名称。
要在每个文件夹的命令行中执行此操作,我可以使用以下命令:
convert *.jpg `echo ${PWD##*/}`.pdf
我想使用bash脚本从顶级文件夹中执行此操作。
答案 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"