regex - find -regex 比 find | 慢grep

标签 regex bash find grep

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

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 解决方案速度较慢吗?

最佳答案

很可能是因为 grep 及其正则表达式引擎多年来经过了高度优化,因为这是它唯一的目的(“做一件事并把它做好”)。我不知道 find 使用什么正则表达式引擎,但它显然不如 grep 那样高度精致,可能是因为它是一个不太常用的次要功能。

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

关于regex - find -regex 比 find | 慢grep,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10431331/

相关文章:

java - 分析算法 最佳、最差和平均情况

python - 出现后提取数字字符?

javascript - 如何在 JavaScript 中使用正则表达式验证文件扩展名

Python:正则表达式:查找可以在任何地方的模式+空间

ruby - 查找名称与模式匹配的元素

bash - 防止显示键入的字符(例如在 termios 中禁用 "echo"属性)

regex - 将可选参数与 Bash 正则表达式中的非捕获组匹配

linux - 如何查找不包括符号链接(symbolic link)的文件?

unix - 如何将 find 命令返回的文件列表通过管道传递给 cat 以查看所有文件

linux - 如何设置终端标题以在运行时显示当前正在运行的命令,并在完成后将其显示在括号中?