【问题标题】:Converting all .pdf files in folder tree to .png将文件夹树中的所有 .pdf 文件转换为 .png
【发布时间】:2014-01-16 23:03:34
【问题描述】:

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

【问题讨论】:

    标签: bash shell ubuntu imagemagick imagemagick-convert


    【解决方案1】:

    尝试单独使用find。无需使用循环。

    我没有测试过这个命令,但它应该工作。

    find ./polkadots -name 'image.pdf' -exec convert -transparent white -fuzz 10% {} image.png \; -print

    末尾的-print 是可选的。我更喜欢查看哪些文件被修改了。

    【讨论】:

    • 我试过你的命令,但是一按回车,它就会弹出一个新的命令行。不需要花费我期望的时间来处理,而且似乎没有在任何地方创建新文件。
    • 您在哪个目录中执行搜索?试试find full_path_to_the_dir ...
    • 嗯...通过您的编辑(添加额外的引号),它现在会打印出“find: missing argument to '-exec'”。路径是准确的 - 我已经测试了几次。就像我上面说的,如果我只是做一个“查找”来定位所有的 .pdf,它会打印出准确的列表
    • 我还编辑了我的问题 - 我的原始脚本正在转换文件,但它正在将它们转换为我在 (./) 中开始的目录中的 .png,而不是在它找到的目录中.pdf 转换(./polkadots/*/* 等)
    【解决方案2】:

    也许你可以直接在 convert 命令中找到输出选项,它可以将 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
    

    如果你需要转换 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
    

    【讨论】:

    • 是的,我需要转换树中的所有 .pdf 文件(它们都被命名为“image.pdf”)。
    • 当然,那么第一个怎么样,它应该可以解决您的问题。
    【解决方案3】:

    如果你使用的是 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
    

    【讨论】:

      猜你喜欢
      • 2017-08-08
      • 2011-11-23
      • 1970-01-01
      • 2013-09-25
      • 1970-01-01
      • 1970-01-01
      • 2020-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多