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

Batch convert PNGs to individual PDFs while maintaining deep folder hierarchy in bash

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

我会运行进一步解决问题,这可能会使事情复杂化。也许我应该写一个脚本? (我一共n00b fyi)

"further problem"是我的一些sheet音乐跨越一页以上,所以如果脚本可以解析包含“1of2”和“2of2”的文件名,将其转换为单个pdf,那会很整洁。

我有哪些选择?

非常感谢。

您可以遍历文件夹层次结构中的 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。您需要找到名称中包含 1of22of2 的所有 pdf 文件,以及那些包含 运行 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

参见:

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

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

您将获得扩展名为“.png.pdf”的新 PDF 文件(例如,image.png 将转换为图像。png.pdf) 要更正扩展名,您可以 运行 再次找到命令,但这次在 -exec 选项后使用 "rename"。

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

如果你想删除源PNG文件,你可以使用这个命令,它会递归地删除每个子文件夹中所有扩展名为“.png”的文件:

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

如果我理解:

  • 您想将所有 png 文件从深层文件夹结构连接成一个 pdf

所以...

  1. 确保你的 png 在你的文件夹中按你想要的顺序排列
  2. 请注意,您可以将命令的输出(比如搜索命令 ;) )重定向到 convert 的输入,并告诉 convert 以一个 pdf 格式输出。

转换的一般语法:

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 文件...例如,您可能需要使用 -quality "60" 重新 convert ...
  • 所以请保留您的原始资源,直到您不再需要它们为止

更新答案

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

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

它使用 GNU Parallel,它在 Linux/Unix 上很容易获得,并且可以简单地安装在 OSX 和 homebrew 上,使用:

brew install parallel

原始答案(已接受)

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

首先启用 extended globbing

shopt -s globstar

然后递归地将 PNG 转换为 PDF:

mogrify -format pdf **/*.png