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 返回“命令中指定的参数过多”[重复]的主要内容,如果未能解决你的问题,请参考以下文章