我正在尝试列出我们在一个月内收到的所有文件
文件名模式将是
20110101000000.txt
YYYYMMDDHHIISS.txt
整个目录有数百万个文件。一个月可以至少有 50000 个文件。子目录的想法仍在等待中。有没有办法列出文件名几乎相似的大量文件。
grep -l 20110101*
正在尝试此操作并返回错误。我尝试php花了很长时间,这就是我使用shell脚本的原因。我不明白为什么外壳也没有给出结果请提出任何建议!!
$ 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 参数。
这应该是更快的方法:
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-
20110101* 在传递给命令之前被 shell 扩展,因此您将为 dir 中以 20110101 开头的每个文件传递一个参数。
如果您只想要一个匹配文件的列表,您可以使用查找:
find . -name "20110101*"
(请注意,这也将搜索每个子目录)
这里有一些深入的信息,还有另一个解决方法:for FILE in 20110101*; do grep foo ${FILE}; done
。大多数人会使用 xargs 和更有经验的管理员使用 -exec {} +,其完成完全相同,只是键入时间较短。人们将使用内联 shell 进行构造,当运行更多进程不如查看结果重要时。使用 for 构造,您最终可能会运行 grep 数千次,但您可以实时看到每个匹配项,而使用 find 和/或 xargs 时,您会看到批处理结果,但是 grep 的运行要少得多。
你需要输入一个搜索词,所以
grep -l "search term" 20110101*
如果只想查找文件,请使用 ls 20110101*
只需通过管道将 ls 的输出传输到 grep:
ls | grep '^20110101'