我正在尝试编写一个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文件与数字排序合并的任何想法
答案 0 :(得分:27)
你可以使用$()
嵌入命令的结果,
所以你可以做以下
$ pdfunite $(ls -v *.pdf) output.pdf
或
$ pdfunite $(ls *.pdf | sort -n) output.pdf
但请注意,当filename包含特殊字符(如空格)时,这不起作用。
如果您可以执行以下操作:
ls -v *.txt | bash -c 'IFS=$'"'"'\n'"'"' read -d "" -ra x;pdfunite "${x[@]}" output.pdf'
虽然看起来有点复杂,但它只是
的组合请注意,您无法使用xargs
,因为pdfunite
要求输入pdf' s作为参数的中间部分。
我避免使用readarray
,因为较旧的bash版本不支持此版本,但如果你有较新的IFS=.. read -ra ..
,则可以使用它代替bash
。
答案 1 :(得分:0)
分多步完成。我假设你有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]。在上面的命令中进行了更正。
答案 2 :(得分:0)
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 ...
。)destfile
之前附加 xargs
,确保以 NUL 结尾。pdfunite
命令。我们提供了 -x
选项,以便 xargs
在命令长度太长时退出。我们不希望 xargs
执行部分构造的命令。此解决方案处理带有嵌入换行符和空格的文件名。
答案 3 :(得分:-1)
您可以重命名文档,例如001.pdf 002.pdf等。