grep 返回“命令中指定的参数过多”[重复]

Posted

技术标签:

【中文标题】grep 返回“命令中指定的参数过多”[重复]【英文标题】:grep returns "Too many argument specified on command" [duplicate] 【发布时间】:2011-08-21 18:38:56 【问题描述】:

我正在尝试列出我们在一个月内收到的所有文件

文件名模式将是

20110101000000.txt

YYYYMMDDHHIISS.txt

整个目录包含数百万个文件。 一个月内至少可以有 50000 个文件。 子目录的想法仍然悬而未决。 有没有办法列出文件名几乎相似的大量文件。

grep -l 20110101*    

我正在尝试这个并返回错误。 我尝试 php 花了很长时间,这就是我使用 shell 脚本的原因。我不明白为什么 shell 也没有给出结果 请给点建议!!

【问题讨论】:

2011 年提出的这个问题是 2012 年提出的问题的重复!!! 相关:Does "argument list too long" apply to shell builtins? 【参考方案1】:
$ find ./ -name '20110101*' -print0 -type f | xargs -0 grep -l "search_pattern"

您可以使用 find 和 xargs。 xargs 将为 find 找到的每个文件运行 grep。您可以使用 -P 来并行运行多个 grep,并使用 -n 来运行每个 grep 命令调用的多个文件。 find 中的 print0 参数用空字符分隔每个文件名,以避免文件名中的任何空格引起的混淆。如果您确定不会有任何空格,您可以删除 -print0 和 -0 参数。

【讨论】:

谢谢。我希望“查找”只返回文件名。现在它正在返回 ./filename。我尝试使用只是 .但也不是 避免使用无用的 xargs。仅查找解决方案会更简单且速度稍快。【参考方案2】:

这应该是更快的方式:

find . -name "20110101*" -exec grep -l "search_pattern" +

是否要避免前导点:

find . -name "20110101*" -exec grep -l "search_pattern" + | sed 's/^.\///'

或者更好地感谢adl:

find . -name "20110101*" -exec grep -l "search_pattern" + | cut -c3-

【讨论】:

| cut -c3- 也是删除每行前两个字符的简单方法。【参考方案3】:

20110101* 在传递给命令之前会被您的 shell 扩展,因此您会为目录中以 20110101 开头的每个文件传递一个参数。

如果你只想要一个匹配文件的列表,你可以使用 find:

find . -name "20110101*"

(请注意,这也会搜索每个子目录)

【讨论】:

【参考方案4】:

一些深入的信息可用here 以及另一种解决方法:for FILE in 20110101*; do grep foo $FILE; done。大多数人会使用 xargs 和经验丰富的管理员使用 -exec + 来完成完全相同的操作,只是输入时间更短。当运行更多进程不如查看结果重要时,可以使用内联 shell 进行构造。使用 for 构造,您最终可能会运行 grep 数千次,但您会实时看到每个匹配项,而使用 find 和/或 xargs 您会看到批处理结果,但运行 grep 的次数要少得多。

【讨论】:

【参考方案5】:

你需要输入一个搜索词,所以

grep -l "search term" 20110101*

如果您只想查找文件,请使用ls 20110101*

【讨论】:

【参考方案6】:

只需将 ls 的输出通过管道传输到 grep:

ls | grep '^20110101'

【讨论】:

谢谢 我怎样才能给这个搜索词? @zod:您的问题似乎表明您只想要目录中名称以“20110101”开头的所有文件的列表,这就是这段代码的作用;它使用“^20110101”作为在ls的输出中搜索的模式。

以上是关于grep 返回“命令中指定的参数过多”[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如果上一个命令没有返回任何内容,则不要调用 xargs [重复]

在grep命令后使用时不显示awk的输出[重复]

Grep打印所有文件内容[重复]

从 grep 中排除 .svn 目录 [重复]

如何使用grep从文件中循环模式[重复]

管道进入 grep -v 时获取退出代码 [重复]