反转要处理的 pdf 文件的顺序

反转要处理的 pdf 文件的顺序

上下文: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

您还可以添加nglob 限定符,使按名称排序为数字:

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.pdffile3.pdf因为 with ,十进制数字序列进行数字比较(这与 GNU或 GNUn所做的类似)。ls -vsort -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),它以预期的相反顺序连接文件。

相关内容