我正在尝试列出我们在一个月内收到的所有文件
文件名模式将是
20110101000000.txt
YYYYMMDDHHIISS.txt
整个目录有数百万个文件。 一个月内最少可以有50000个文件。 子目录的想法仍然悬而未决。 有没有办法列出文件名几乎相似的大量文件。
grep -l 20110101*
尝试这个并返回错误。 我尝试php花了很长时间,这就是为什么我使用shell脚本。我不明白为什么shell也没有给出结果 有任何建议请!!
答案 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'