2

我有一个使用正则表达式查找文件的脚本。代码如下:

find $dir | grep "$regex"

该脚本运行速度有点慢,我想对其进行优化。搜索需要一些时间来执行,我想从中获得更好的性能。我试过这个尝试:

find $dir -regex ".*${regex}.*"

我期待更快的结果,因为没有创建额外的过程来解析正则表达式。

然而结果不同,令我惊讶的是,命令“find | grep”比“find -regex”更快(尽管它需要更多的系统时间,正如人们所预料的那样)

我已经计时了这种行为:

查找 | grep 结果

real   0m12.467s
user   0m2.568s
sys    0m7.260s

查找 -regex 结果

real   0m16.778s
user   0m6.772s
sys    0m6.380s

您知道为什么 find -regex 解决方案较慢吗?

4

1 回答 1

5

很可能是因为grep它的正则表达式引擎多年来一直在高度优化,因为这是它的唯一目的(“做一件事并做好”)。我不知道 regex 引擎find使用什么,但它显然没有 's 那样高度精炼grep,可能是因为它是一个不太常用的辅助功能。

此外,如果您正在使用此文件列表执行任何操作,则应该使用更安全的空白方式来执行此操作。我认为grep不能接受以空值分隔的输入(尽管它可以输出),因此find [...] -regex [...] -print0即使速度较慢,您也应该使用。

于 2012-05-03T15:41:42.310 回答