当 -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.
因为 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
要回答您的问题,具体来说,请使用ls -lrt | xargs grep xyz --
(注意--
,这表示后面-
出现的任何破折号都将被视为字面意思,而不是作为选项标志 - 请参阅@CarlosCampderrós 的回答,了解您的命令扩展为什么),但我强烈怀疑您有正确的设置开始,因为它不太可能实现任何有用的东西,如使用的。
您更有可能尝试xyz
按时间倒序在所有文件中查找。如果是这样,那么使用ls -1rt | xargs grep xyz --
(注意 dash-one -1
,而不是dash-ell -l
。)--
在这种情况下,这是真正的可选(除非您希望一个或多个文件的名称以 dash 开头-
。)