上下文:Catalina = zsh(首选)或 16.04 Ubuntu = bash
一个qpdf
例子表明:
# To merge (concatenate) all the pages of a list of PDF files and save the result as a new PDF:
qpdf --empty --pages <file1.pdf> <file2.pdf> <file3.pdf> -- <output.pdf>
特定目录中的一组 .pdf 文件(文件名中带有空格)将被连接:
# Concatenate Drafts file to ../concatDrafts.pdf (76 pdf files)
# https://stackoverflow.com/a/53754681/4953146
qpdf --empty --pages *.pdf -- out.pdf
虽然qpdf
命令是连接 .pdf 文件,要连接 .pdf 文件的相反顺序。要处理的文件的顺序由以下命令返回:
ls -r.pdf
要处理 .pdf 文件名中的空格: xargs研究表明需要:
ls -r *.pdf | xargs -E '\n'
将 ls 的输出通过管道传输到命令中的命令的思维过程是什么qpdf
?
答案1
在 中zsh
,它只是:
qpdf --empty --pages ./*.pdf(On) -- output.pdf
哪里On
有一个全局限定符按 ame反向o
排序 glob 扩展(大写O
,小写表示直接)n
。
您还可以添加n
glob 限定符,使按名称排序为数字:
qpdf --empty --pages ./*.pdf(nOn) -- output.pdf
比较:
$ print -r ./*.pdf(On)
./file3.pdf ./file2.pdf ./file1.pdf ./file11.pdf ./file10.pdf
$ (LC_ALL=C; print -r ./*.pdf(On))
./file3.pdf ./file2.pdf ./file11.pdf ./file10.pdf ./file1.pdf
(按词汇顺序,file10.pdf
位于 之前file2.pdf
,甚至在比较字符串时在第一近似中忽略file1.pdf
标点符号(此处 )的区域设置之前)。.
和:
$ print -r ./*.pdf(nOn)
./file11.pdf ./file10.pdf ./file3.pdf ./file2.pdf ./file1.pdf
后面file10.pdf
是file3.pdf
因为 with ,十进制数字序列进行数字比较(这与 GNU或 GNUn
所做的类似)。ls -v
sort -V
答案2
您可以使用答案如何反转 shell 参数?反转*.pdf
扩展到的内容。首先将其存储为 shell 的位置参数:
set -- *.pdf
然后使用链接问题的任何好的答案。我选择这个:
flag=''; for a in "$@"; do set -- "$a" ${flag-"$@"}; unset flag; done
现在"$@"
扩展到你想要的。将其与您想要的命令一起使用:
qpdf --empty --pages "$@" -- out.pdf
如果您不想丢失旧的位置参数,请在子 shell 中运行这三个命令。
答案3
(对于 GNU bash shell)
您可以使用tac
反转 的参数列表xargs
。对于qpdf
您运行的命令,我们必须在末尾组合两个以上参数:--
和。out.pdf
这里使用换行符作为参数分隔符,这意味着带有换行符的文件名不会被处理:
printf "%s\n" "out.pdf" "--" *.pdf | tac | xargs -d'\n' qpdf --empty --pages
此处对于任何文件名,使用空分隔符:
printf "%s\0" "out.pdf" "--" *.pdf | tac -s $'\0' | xargs -0 qpdf --empty --pages
我测试了(Linux 上的 GNU Bash shell),它以预期的相反顺序连接文件。