将PNG批量转换为单个PDF,同时在bash中维护深层文件夹层次结构

时间:2016-08-08 20:06:10

标签: image bash pdf batch-processing imagemagick-convert

我找到了一个声称可以创建一个文件夹的解决方案,但我有一个深层文件夹层次的乐谱,我想将其从png批量转换为pdf。我的解决方案是什么样的?

我将遇到另一个问题,这可能会使问题复杂化。也许我应该写一个剧本? (我总共n00b fyi)

"进一步的问题"我的一些乐谱跨越多个页面,所以如果脚本可以解析包含" 1of2&#​​34;的文件名。和" 2of2&#​​34;要变成单一的PDF文件,这应该是整洁的。

我有什么选择?

非常感谢你。

4 个答案:

答案 0 :(得分:1)

您可以循环文件夹层次结构中的png个文件,并按如下方式处理每个文件:

find /path/to/your/files -name '*.png' |
while read -r f; do
    g=$(basename "$f" .png).pdf
    your_conversion_program <"$f" >"$g"
done

要合并pdf - s,您可以使用pdftk。您需要查找名称中包含pdf1of2的所有2of2个文件,然后对这些文件运行pdftk

find /path/to/your/files -name '*1of2*.pdf' |
while read -r f1; do
    f2=${f1/1of2/2of2}                            # name of second file
    ([ -f "$f1" ] && [ -f "$f2" ]) || continue    # check both exist
    g=${f1/1of2//}                                # name of output file
    (! [ -f "$g" ]) || continue                   # if output exists, skip
    pdftk "$f1" "$f2" output "$g"
done

请参阅:

答案 1 :(得分:1)

关于深层文件夹层次结构,您可以使用find with -exec选项。 首先,您在每个子文件夹中找到所有PNG并将其转换为PDF:

find ./ -name \*\.png -exec convert {} {}.pdf \;

您将获得扩展名为&#34; .png.pdf&#34;的新PDF文件(例如,image.png将转换为image.png.pdf) 要更正扩展名,您可以再次运行find命令,但这次使用&#34;重命名&#34;在-exec选项之后。

find ./ -name \*\.png\.pdf -exec rename s/\.png\.pdf/\.pdf/ {} \;

如果要删除源PNG文件,可以使用此命令删除所有文件&#34; .png&#34;在每个子文件夹中递归扩展:

find ./ -name \*\.png -exec rm {} \;

答案 2 :(得分:1)

更新了答案

作为替代方案,以下应该更快(因为它并行执行转换)并且还能够处理更多数量的文件:

find . -name \*.png -print0 | parallel -0 convert {} {.}.pdf

它使用 GNU Parallel ,它可以在Linux / Unix上随时使用,可以使用homebrew在OSX上简单地安装:

brew install parallel

原始答案(已接受)

如果您拥有bash版本4或更高版本,则可以使用extended globbing来递归目录并简单地完成工作:

首先使用以下内容启用extended globbing

shopt -s globstar

然后以递归方式将PNG转换为PDF:

mogrify -format pdf **/*.png

答案 3 :(得分:0)

如果我理解:

  • 您希望将所有png文件从深层文件夹结构连接到一个单独的pdf

所以...

  1. 确保您在文件夹中按照您的意愿订购png
  2. 请注意,您可以将命令的输出(比如搜索一个;))重定向到convert的输入,并在一个pdf中告诉convert到output。
  3. 转换的一般语法:

    convert 1.png 2.png ... global_png.pdf
    

    以下命令:

    convert `find . -name '*'.png -print` global_png.pdf
    
    • 从cur_dir
    • 搜索文件夹中的png文件
    • 将命令find 的输出重定向到 convert的输入,这是通过 返回引用 find命令
    • 将作品和输出转换为pdf文件

    (这个非常简单的命令行只能使用未填充的文件名工作正常,不要错过引用外来字符,然后再引用find命令;)

    [编辑]护理....

    确定你在做什么。

    如果你删除你的png文件,你只会丢失原始资源......

    • 这可能是一个非常糟糕的做法...
    • 使用convert而没有任何棘手的-quality输出选项可能会创建一个巨大的pdf文件......例如,您可能需要重新convert -quality "60"。 。
    • 请保留原始资料,直到您不再需要它们为止