繁体   English   中英

用数字排序合并pdf文件

[英]Merge pdf files with numerical sort

我正在尝试编写一个 bash 脚本来将目录的所有 pdf 文件合并为一个 pdf 文件。 命令pdfunite *.pdf output.pdf成功实现了这一点,但它按常规顺序合并输入文档:

1.pdf
10.pdf
11.pdf
2.pdf
3.pdf
4.pdf
5.pdf
6.pdf
7.pdf
8.pdf
9.pdf

虽然我希望按数字顺序合并文档:

1.pdf
2.pdf
3.pdf
4.pdf
5.pdf
6.pdf
7.pdf
8.pdf
9.pdf
10.pdf
11.pdf

我想混合ls -vsort -npdfunite可以解决问题,但我不知道如何组合它们。 关于如何将 pdf 文件与数字排序合并的任何想法

您可以使用$()嵌入命令的结果,因此您可以执行以下操作

$ pdfunite $(ls -v *.pdf) output.pdf

或者

$ pdfunite $(ls *.pdf | sort -n) output.pdf

但是,请注意,当文件名包含特殊字符(如空格)时,这不起作用。

在这种情况下,您可以执行以下操作:

ls -v *.txt | bash -c 'IFS=$'"'"'\n'"'"' read -d "" -ra x;pdfunite "${x[@]}" output.pdf'

虽然看起来有点复杂,但它只是组合

请注意,您不能使用xargs因为pdfunite需要输入 pdf 作为参数的中间。 我避免使用readarray因为它在较旧的 bash 版本中不受支持,但您可以使用它代替IFS=.. read -ra ..如果您有更新的bash

分多个步骤进行。 我假设你有从 1 到 99 的文件。

 pdfunite $(find ./ -regex ".*[^0-9][0-9][^0-9].*"  | sort) out1.pdf
 pdfunite out1.pdf $(find ./ -regex ".*[^0-9]1[0-9][^0-9].*"  | sort) out2.pdf
 pdfunite out2.pdf $(find ./ -regex ".*[^0-9]2[0-9][^0-9].*"  | sort) out3.pdf

等等。

最终文件将按数字顺序包含您所有的 pdf。

!!! 谨防写入out1.pdf等输出文件,否则pdfunite会覆盖最后一个文件!!!

编辑:对不起,我错过了每个正则表达式中的 [^0-9]。 在上面的命令中更正了它。

您可以重命名您的文档,即 001.pdf 002.pdf 等。

destfile=combined.pdf
find . -maxdepth 1 -type f -name '*.pdf' -print0 \
   | sort -z -t '/' -k2n \
   | { cat; printf '%s\0' "$destfile"; } \
   | xargs -0 -x pdfunite
  1. 变量destfile保存目标 pdf 文件的名称。
  2. find命令查找当前目录中的所有 pdf 文件,并将它们作为 NUL 分隔列表输出。
  3. sort命令读取 NUL 分隔的文件名列表。 它指定了/的字段分隔符。 它按数字按第二个字段排序。 (回想一下find的输出看起来像./11.pdf ... .)
  4. 我们在发送到xargs之前附加destfile ,确保以 NUL 结束它。
  5. xargs 读取 NUL 分隔的 args 并将它们提供给pdfunite命令。 我们提供了-x选项,以便在命令长度太长时xargs将退出。 我们不希望xargs执行部分构造的命令。

此解决方案处理带有嵌入换行符和空格的文件名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM