为什么 ls 在与xargs和grep组合传递-l标志时不起作用?
$ ls -rt | xargs grep xyz
有效,但是:
$ ls -lrt | xargs grep xyz
grep: invalid option -- '-'
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.
答案 0 :(得分:3)
因为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
答案 1 :(得分:2)
要回答您的问题,具体,请使用ls -lrt | xargs grep xyz --
(请注意--
,这表示之后出现的任何破折号-
都应按字面意思理解,而不是选项标记 - 请参阅@CarlosCampderrós's answer以了解您的命令扩展到的内容,但我强烈怀疑您的设置是否正确,因为不太可能实现任何有用的东西,如使用。
更有可能您正试图在所有文件中以反向时间顺序grep xyz
。如果是,请使用ls -1rt | xargs grep xyz --
(注意破折号-1
,不破折号-l
。)--
在这种情况下是真正可选的(除非您希望一个或多个文件的名称以短划线-
开头。)