合并具有数字排序的pdf文件

时间:2014-05-13 23:31:52

标签: linux bash sorting pdf numeric

我正在尝试编写一个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文件与数字排序合并的任何想法

4 个答案:

答案 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
  1. 变量 destfile 保存目标 pdf 文件的名称。
  2. find 命令查找当前目录中的所有 pdf 文件,并将它们作为 NUL 分隔列表输出。
  3. sort 命令读取 NUL 分隔的文件名列表。它指定 / 的字段分隔符。它按数字按第二个字段排序。 (回想一下 find 的输出看起来像 ./11.pdf ...。)
  4. 我们在发送到 destfile 之前附加 xargs,确保以 NUL 结尾。
  5. xargs 读取 NUL 分隔的参数并将它们提供给 pdfunite 命令。我们提供了 -x 选项,以便 xargs 在命令长度太长时退出。我们不希望 xargs 执行部分构造的命令。

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

答案 3 :(得分:-1)

您可以重命名文档,例如001.pdf 002.pdf等。

相关问题