[英]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 -v
或sort -n
和pdfunite
可以解决问题,但我不知道如何组合它们。 关于如何将 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
destfile
保存目标 pdf 文件的名称。find
命令查找当前目录中的所有 pdf 文件,并将它们作为 NUL 分隔列表输出。sort
命令读取 NUL 分隔的文件名列表。 它指定了/
的字段分隔符。 它按数字按第二个字段排序。 (回想一下find
的输出看起来像./11.pdf ...
.)xargs
之前附加destfile
,确保以 NUL 结束它。pdfunite
命令。 我们提供了-x
选项,以便在命令长度太长时xargs
将退出。 我们不希望xargs
执行部分构造的命令。此解决方案处理带有嵌入换行符和空格的文件名。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.