2012-05-03 92 views
2

我有一个使用正则表达式查找文件的脚本。代码如下:查找-regex比find |更慢grep

find $dir | grep "$regex" 

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

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

由于没有创建额外的进程来解析正则表达式,因此我期待稍快的结果。

然而结果却是不同的,并令我惊讶的命令“找到| grep的”比“找到-regex”更快(尽管它需要更多的系统时间,作为一个本来期望)

我有定时此行为:

查找| grep的结果

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

查找-regex结果

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

你有什么想法,为什么找-regex解决方案是慢?

回答

5

最有可能是因为grep及其正则表达式引擎已经过多年高度优化,因为这是它唯一的目的(“做一件事,做得很好”)。我不知道使用哪种正则表达式引擎find,但它显然不像grep那样高度精炼,可能是因为它是一种不常用的次要功能。另外,如果你正在做这个文件列表的任何事情,你应该使用更安全的方式来做到这一点。我不认为grep可以采用以零分隔的输入(虽然它可以输出它),所以即使速度较慢,也应该使用find [...] -regex [...] -print0

+0

谢谢你的提示。在这个用例中,我不需要-print0,但它是我经常使用的开关。我在Ruby中找到了查找的结果,并将字符串拆分为“\ n”,因此除非名称中有\ n,否则我应该没问题。 – Huygens