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



我在 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

相关内容

  • 没有找到相关文章

最新更新