1

当 -l 标志与 xargs 和 grep 结合传递时,为什么ls不起作用?

$ ls -rt | xargs grep xyz

有效,但是:

$ ls -lrt | xargs grep xyz
grep: invalid option -- '-'
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.
4

2 回答 2

3

因为 for 的输出ls -l类似于:

-rw-r--r-- 1 root  root  1491872 2012-11-22 03:07 Xvfb_screen0

将其连接到 xargs ( ls -l | xargs grep xyz) 使您的 grep 命令成为

grep xyz -rw-r--r-- 1 root  root  1491872 2012-11-22 03:07 Xvfb_screen0

它没有任何意义。

编辑

在这里回答@vladr 评论,因为它的格式比评论框更好。xargs 输入中的每个空格分隔文本都作为新参数传递给执行的命令,如您所见:

$ ls -l 
total 4
-rwxrwxr-x 1 carlos carlos 18 2012-11-22 15:17 foo

$ cat foo
#!/bin/sh
echo $#

$ ls -l | xargs ./foo
10

xargs通过将分隔符设置为:可以按照您所说的方式行事\n

$ ls -l | xargs -d '\n' ./foo
2
于 2012-11-22T14:11:43.017 回答
2

要回答您的问题,具体来说,请使用ls -lrt | xargs grep xyz --(注意--,这表示后面-出现的任何破折号都将被视为字面意思,而不是作为选项标志 - 请参阅@CarlosCampderrós 的回答,了解您的命令扩展为什么),但我强烈怀疑您有正确的设置开始,因为它不太可能实现任何有用的东西,如使用的

您更有可能尝试xyz按时间倒序在所有文件中查找。如果是这样,那么使用ls -1rt | xargs grep xyz --(注意 dash-one -1而不是dash-ell -l。)--在这种情况下,这是真正的可选(除非您希望一个或多个文件的名称以 dash 开头-。)

于 2012-11-22T14:04:34.983 回答