我有一个下载我想要合并的 PDF 的目录。合并的顺序应该是下载的顺序(即,首先下载要合并的第一个 PDF,其次下载要合并的第二个 PDF,依此类推)。
我曾经在 PDF 目录中执行以下终端命令来完成此任务:
gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=merged.pdf $(ls -t | tail -r)
这用于生成名为“merged.pdf”的合并 PDF。
最近我迁移到了一台新计算机(新旧计算机都是Mac,使用的是ZSH而不是BASH),我发现上述命令在新计算机上停止工作。它会生成以下错误:
$ gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=merged.pdf $(ls -t | tail -r)
Error: /undefinedfilename in (The)
Operand stack:
Execution stack:
%interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push
Dictionary stack:
--dict:764/1123(ro)(G)-- --dict:0/20(G)-- --dict:75/200(L)--
Current allocation mode is local
Last OS error: No such file or directory
GPL Ghostscript 10.00.0: Unrecoverable error, exit code 1
奇怪的是,如果我像这样明确指定要合并的 PDF,它就可以正常工作
gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=merged.pdf first.pdf second.pdf third.pdf
so
gs
显然工作正常。另外,我发现 ls -t | tail -r
会按下载顺序生成 PDF 文件名列表:
$ ls -t | tail -r
first.pdf
second.pdf
third.pdf
所以
ls -t | tail -r
也工作正常。
如何才能使
gs
与 ls -t | tail -r
结合再次发挥作用?希望有任何见解。
怎么可以
您的
$(...)
似乎返回了几个单词,并用空格分隔(即类似 first.pdf second.pdf third.pdf
的内容)。它们作为单个参数传递给 gs
。因此 gs
正在搜索具有这个长名称的单个文件。
您可以通过打开
set -x
来查看到底发生了什么。这应该显示管道的精确输出。
但是,基本问题是您说您正在使用为 bash 编写的代码,并且现在正在运行 zsh。您需要使用 bash 执行 bash 代码,而不是使用 zsh。