我有多个系列的JPEG文件。 每个系列都在它自己的文件夹中。 我想每个系列转换成单一的PDF。 我还要PDF中具有相同的名称,因为它是在文件夹中。
要做到这一点每个文件夹,我可以使用下面的命令,在命令行:
convert *.jpg `echo ${PWD##*/}`.pdf
我想从顶层文件夹一个bash脚本做到这一点。
我有多个系列的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
将扩展为给猛砸,即通过发现目录中的论点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"