我在 Ubuntu 上,我有一个包含.pdf文件的文件夹树。 我需要将每个转换为.png格式。 我目前使用的 bash 脚本是:
for f in $(find ./polkadots -name 'image.pdf'); do
convert -transparent white -fuzz 10% $f image.png;
done
我已经测试了 for 循环本身,它可以工作(它会在我需要转换的 ./polkadots 文件夹下生成所有.pdf文件的列表):
for f in $(find ./polkadots -name 'image.pdf'); do
echo "$f";
done
我已经测试了 imagemagic convert 命令本身,它可以工作(它将我当前目录中的单个文件从 .pdf 转换为 .png):
convert -transparent white -fuzz 10% image.pdf image.png
但是,当我将它们结合起来时...控制台坐下来思考了一会儿,然后得出结论。但尚未创建或更改任何文件,也不会生成错误消息。 我做错了什么?
编辑:正在创建新的.png文件,但它们是在我当前的目录中创建的,而不是在找到.pdf的子目录中创建的。 我该如何解决这个问题?
尝试单独使用find
。无需使用循环。
我还没有测试过这个命令,但它应该可以工作。
find ./polkadots -name 'image.pdf' -exec convert -transparent white -fuzz 10% {} image.png ; -print
末尾的-print
是可选的。我更喜欢查看哪些文件已被修改。
也许您可以直接在转换命令中找到输出选项,该选项可以将 png 文件导出到您期望的文件夹中。无论如何,按照您的想法,这是更新的代码:
find ./polkadots -type f -name "image.pdf" |while read line
do
dir=${line%/*}
convert -transparent white -fuzz 10% $line image.png
mv image.png ${dir}/image.png
done
如果您需要转换波卡点文件夹下的所有pdf文件,请尝试以下操作:
find ./polkadots -type f -name "*.pdf" |while read line
do
dir=${line%/*}
file=${line##*/}
file=${file%.*}
convert -transparent white -fuzz 10% $line ${file}.png
echo mv ${file}.png ${dir}/${file}.png
done
如果你使用的是 bash 4+,你应该使用 globstar 而不是 find
#!/bin/bash
shopt -s globstar
for f in ./polkadots/**/image.pdf; do
convert -transparent white -fuzz 10% "$f" "${f%/*}/image.png"
done
如果您使用的是较旧的 bash,您的原始答案接近正常,但有一些错误/潜在错误,
- 如果目录中有空格,则原始脚本将出现错误,因此请使用
| while read -r -d '' f
语法。 - 不要在命令行末尾放置
;
- 引用所有变量以防止扩展问题
- 正如您所指出的,您情况下的主要问题是没有指定目标目录,因此您可以使用
${f%/*}
参数扩展来获取目录(这将删除包括$f中最后一个/
和之后的所有内容,然后将/
放回并附加文件名,如下所示。
编辑
#!/bin/bash
find ./polkadots -name "image.pdf" -print0 | while read -r -d '' f; do
convert -transparent white -fuzz 10% "$f" "${f%/*}/image.png"
done