我在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的子目录中创建的。我该如何解决这个问题?
答案 0 :(得分:1)
单独尝试使用find
。无需使用循环。
我没有测试过这个命令,但它应该工作。
find ./polkadots -name 'image.pdf' -exec convert -transparent white -fuzz 10% {} image.png \; -print
最后的-print
是可选的。我更喜欢看哪些文件已被修改。
答案 1 :(得分:0)
也许你可以直接在convert命令中找到输出选项,它可以将png文件导出到你的expect文件夹。无论如何,请按照您的想法,这是更新的代码:
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
如果您需要转换polkadots文件夹下的所有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
答案 2 :(得分:0)
如果您使用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