繁体   English   中英

Shell:pdfinfo 的输入

[英]Shell: input for pdfinfo

在一条fish上 shell 我写

ls -1t|head -1 |xargs pdfinfo

这基本上应该给我最新修改的文件(这是一个 PDF),然后打印这个文件的 PDFinfo。 但不知何故它因错误而失败

Syntax Warning: May not be a PDF file (continuing anyway)
Syntax Error: Couldn't find trailer dictionary
Syntax Error: Couldn't find trailer dictionary
Syntax Error: Couldn't read xref table

我得到与bash相同的结果。 任何想法我需要适应什么才能运行命令?

这个问题很可能是由于xargs对其输入进行了处理。

默认情况下,它将执行类似 bash 的分词,包括引号。

例如

echo "foo 'bar baz'" | xargs printf '<%s>\n'

将打印<foo><bar baz> ,因为它会执行

printf '<%s>\n' foo 'bar baz'

这意味着如果你有一个带有空格或引号的文件名,它会执行错误的事情。 假设打印最新文件的“ls -1t | head -n 1”出现“foo bar.pdf”,那么它会像这样执行pdfinfo

pdfinfo foo bar.pdf

给它两个单独的文件名,“foo”和“bar.pdf”。

在这种情况下,最简单的解决方案是完全跳过 xargs:

pdfinfo (ls -1t | head -n 1)

您还可以使用鱼的切片来跳过head

pdfinfo (ls -1t)[1]

这只会采用ls -1t s output 的第一行。请注意,fish 仍将在换行符处拆分(与 bash 不同,它不会在空格或制表符处拆分),因此如果您想使用换行符处理文件名(这通常会发生在 unix 上!)你必须以不同的方式来做 - 如果文件名可以包含换行符,则ls output 是不明确的。 可能性包括使用-exec find

如果你必须使用 xargs,你可以使用一些 xargs 实现中可用的-0选项,连同 fish 的string join0添加一个 NUL 字节:

 ls -1t | head -n1 | string join0 | xargs -0 pdfinfo

这将告诉 xargs 禁止其单词拆分,而是读取 arguments NUL 终止(这是明确的,因为 UNIX 文件名和命令行 arguments 通常不能包含 NUL - 因为它将它们作为 NUL 终止的字符串传递)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM