命令中间有空格的文件名(不是 while/for 循环)



我正在尝试提供一个带有 pdftk 空格的文件名列表(将 3 个 PDF 合并为一个 PDF(,但它似乎不喜欢我正在尝试的内容。

# pdftk INPUT1.pdf INPUT2.pdf output OUTPUTFILE.pdf

它可以手动指定文件:

$ pdftk "pdf 1.pdf" "pdf 2.pdf" output t.pdf
$ ls t.pdf
t.pdf (and it works/opens fine)

但以下方法似乎都不起作用:

$ pdftk "$(ls --quoting-style=c | tr "n" " ")" output t.pdf
Error: Unable to find file.
Error: Failed to open PDF file: 
"pdf 1.pdf" "pdf 2.pdf" "pdf 3.pdf" 
Errors encountered.  No output created.
Done.  Input errors, so no output created.

(请注意,不要在 $(ls( 周围使用引号也会失败(

或者这个:

$ ls -1
'pdf 1.pdf'
'pdf 2.pdf'
'pdf 3.pdf'
$ pdftk "$(ls -1 | tr "n" " ")" output t.pdf
Error: Unable to find file.
Error: Failed to open PDF file: 
pdf 1.pdf pdf 2.pdf pdf 3.pdf 
Errors encountered.  No output created.
Done.  Input errors, so no output created.
$ pdftk "$(some command)" output t.pdf

这将运行一些命令,然后双引号将输出封装到单个"单词"中。无论使用什么命令,结果都是pdftk接收包含整个命令输出的单个参数。

解析ls通常被认为是一个坏主意。

正如@RavinderSingh13所建议的,只需指定*.pdf(甚至*(就可以解决您的问题。shell 执行"通配符"以扩展通配符,并自行正确地将它们拆分为"单词":

$ pdftk * output t.pdf

如果您正在运行输出文件名列表的命令以外的ls命令,则需要小心在正确的位置引用。

一些可移植的方法(有一些关于命令输出的假设(在 xargs 的 POSIX 规范的"应用程序使用情况"部分中给出。

在具有 GNU 版本的实用程序的系统上(例如findxargs(使用非标准-print0-0和相关命令参数提供了更健壮的机制,这些参数假定NULL 字符是用于分隔命令输出项的(唯一(特殊字符。

考虑到您一次只想合并 3 个文件,您可以尝试以下操作,我已经在 Ubuntu 系统上对 3 个文件进行了测试(它也处理带有空格的文件名(。 您可以测试一次。

pdftk *.pdf output t.pdf

最新更新