将文件夹树中的所有.pdf文件转换为.png

时间:2014-01-16 23:03:34

标签: bash shell ubuntu imagemagick imagemagick-convert

我在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的子目录中创建的。我该如何解决这个问题?

3 个答案:

答案 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