【问题标题】:grep and ls: 'l' flag not supported for ls when used with xargs?grep 和 ls:与 xargs 一起使用时 ls 不支持“l”标志?
【发布时间】:2012-11-10 22:40:10
【问题描述】:

当 -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.

【问题讨论】:

  • 你希望它做什么?
  • -l 为返回的文件提供时间戳 - 请参见下面的示例

标签: linux unix grep ls xargs


【解决方案1】:

因为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 评论,因为它的格式比 cmets 框更好。 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

【讨论】:

  • 这些年来你已经习惯了使用 -lrt,你不再意识到“长”部分是不正常的 :)
【解决方案2】:

要回答您的问题,特别是,请使用 ls -lrt | xargs grep xyz --(注意 --,这表示后面出现的任何破折号 - 都应按字面意思理解,而不是作为选项标志 - - 请参阅 @CarlosCampderrós's answer 了解您的命令扩展为什么),但我强烈怀疑您的设置是否正确,因为它不太可能实现任何有用的东西,就像使用的那样强>。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多