通过数字排序合并 pdf 文件

问题描述 投票:0回答:4

我正在尝试编写一个 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 文件吗?

linux bash sorting pdf numeric
4个回答
46
投票
您可以使用

$()

 嵌入命令的结果,
所以你可以做以下事情

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

$ pdfunite $(ls *.pdf | sort -n) output.pdf
但是请注意,当文件名包含空格等特殊字符时,这不起作用。

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

ls -v *.pdf | bash -c 'IFS=$'"'"'\n'"'"' read -d "" -ra x;pdfunite "${x[@]}" output.pdf'
虽然看起来有点复杂,但它只是组合

  • 将制表符分隔的文件行读入数组
  • 构建包含空格的参数列表
  • 如何转义单引号字符串中的单引号
请注意,您不能使用

xargs

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


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]。在上面的命令中更正了它。


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


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. 我们在发送到
  5. destfile
     之前附加 
    xargs
    ,并确保以 NUL 结束。
  6. xargs 读取 NUL 分隔的参数并将其提供给
  7. pdfunite
     命令。我们提供了 
    -x
     选项,以便在命令长度太长时 
    xargs
     将退出。我们不希望 
    xargs
     执行部分构造的命令。
此解决方案处理带有嵌入换行符和空格的文件名。

© www.soinside.com 2019 - 2024. All rights reserved.