我使用此命令行将文件夹内的 jpeg 转换为 pdf。
for f in *.jpg; do echo "Converting $f"; convert "$f" "$(basename "$f" .jpg).pdf"; done
但是,我想将多个文件夹中的所有 .jpg 转换为位于同一文件夹内的 .pdf。我需要一个 bash 命令,其中显示“进入文件夹 A,启动到 pdf 的转换,完成后,转到文件夹 B 并执行相同的操作”。
jpeg 文件也可以以 .jpg 或 .JPG 结尾。
我的文件夹结构如下:
Folder A
File1.jpg
File1.jpg
File1.jpg
File1.jpg
File1.jpg
Folder B
File1.jpg
File1.jpg
File1.jpg
...
关于如何实现这一目标有什么想法吗?
答案1
更新为允许文件名*.jpg
并*.JPG
根据更新的问题:
用于-iname
不区分大小写的比较,以及带有模式的变量扩展${file%.[jJ][pP][gG]}
。这实际上会匹配.jpg
任何大小写,例如.JpG
。
假设Folder A
和Folder B
位于当前目录中,并且您想在所有目录中递归执行相同的操作:
find . -type f -iname \*.jpg | while read -r file
do
echo "Converting $file"
convert "$file" " ${file%.[jJ][pP][gG]}.pdf"
done
或者如果您想指定目录名称
find "Folder A" "Folder B" type f -iname \*.jpg | ...
如果您没有命名任何子目录,*.jpg
则可以省略-type f
.
如果您不想在Folder A
等的子目录中递归地进行转换,您可能必须添加一个-maxdepth
条件。
答案2
您所要求的不是递归操作,因此可以通过对原始代码进行简单的修改来处理它:
for f in */*.jpg */*.JPG; do echo "Converting $f"; convert "$f" "${f%.*}.pdf"; done
如果这是用于生产代码而不是一次性的,我会保护没有jpg
文件JPG
或 PDF 已经生成的可能性。当然,添加或调整到您满意的程度:
for f in */*.jpg */*.JPG
do
if [[ -f "$f" ]] && [[ ! -f "${f%.*}.pdf" ]]
then
echo "Converting $f"
convert "$f" "${f%.*}.pdf"
fi
done