将 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
。您需要找到名称中包含 1of2
和 2of2
的所有 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。
所以...
- 确保你的 png 在你的文件夹中按你想要的顺序排列
- 请注意,您可以将命令的输出(比如搜索命令 ;) )重定向到 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
我找到了一个声称可以处理一个文件夹的解决方案,但我有一个很深的 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
。您需要找到名称中包含 1of2
和 2of2
的所有 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。
所以...
- 确保你的 png 在你的文件夹中按你想要的顺序排列
- 请注意,您可以将命令的输出(比如搜索命令 ;) )重定向到 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