我有以下命令
find /var -type f -exec grep "param1" {} \; -print
使用此命令,我可以在 /var 下的任何文件中找到 param1 字符串,但这所需的时间很长。
我需要另一种可能性来在文件中查找字符串但比我的例子快得多
答案1
您可以尝试直接使用 grep,如下所示
grep -R "param1" /var/*
答案2
答案3
这里有几个因素在起作用:
第一的通过使用-exec
,find 会为grep
它找到的每个文件生成一个新进程。
这可以通过使用 xargs 来实现,就像 Felipe Alvarez 的回答中那样(我写了一个博客文章关于这个 5 年多前)或使用-exec grep param1 {} +
(注意用+
而不是\;
)。使用 时+
,“命令行是通过在末尾附加每个选定文件名来构建的;命令的总调用次数将远远少于匹配文件的数量”(来自查找手册页)
第二,下的文件数量和大小/var
可能非常大。
除了-type f
限制搜索的文件之外,您还可以添加参数吗?find
有按时间、所有者、名称模式等限制的选项。例如,您可以执行以下操作:
find /var -type f -name "access*log" -mtime -7 -exec grep param1 {} +
这将查找过去 7 天内修改过的文件,其名称以“access”开头,以“log”结尾。只有匹配的文件才会成为 exec/grep 的一部分。
答案4
我建议使用:
grep -RInis "param1" /var
有关详细信息,请参阅
man grep
如果速度如此重要,您可能需要考虑 fgrep,但根据实施情况,它可能不会更快。