我正在尝试编写一个 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 *.pdf | bash -c 'IFS=$'"'"'\n'"'"' read -d "" -ra x;pdfunite "${x[@]}" output.pdf'
虽然看起来有点复杂,但它只是组合请注意,您不能使用
xargs
,因为
pdfunite
需要输入 pdf 作为参数的中间。 我避免使用
readarray
,因为旧的 bash 版本不支持它,但如果您有较新的
IFS=.. read -ra ..
,您可以使用它代替
bash
。
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]。在上面的命令中更正了它。
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
执行部分构造的命令。