grep返回“命令中指定的参数太多”

时间:2011-05-09 15:01:41

标签: shell file unix

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

文件名模式将是

20110101000000.txt

YYYYMMDDHHIISS.txt

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

grep -l 20110101*    

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

6 个答案:

答案 0 :(得分:5)

$ find ./ -name '20110101*' -print0 -type f | xargs -0 grep -l "search_pattern"

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

答案 1 :(得分: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-

答案 2 :(得分:1)

在传递给命令之前,你的shell会扩展20110101 *,所以你得到的一个参数传递给以20110101开头的目录中的每个文件。

如果您只想要匹配文件列表,可以使用find:

find . -name "20110101*"

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

grep -l "search term" 20110101*

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

答案 5 :(得分:0)

只需将ls的输出传递给grep:

ls | grep '^20110101'