【发布时间】:2018-01-18 22:06:27
【问题描述】:
我正在尝试对存储库(大约 200mB,3000 个文件)进行搜索和替换,我发现与 grep 相比,它对于相同的表达式真的很慢。即使很难匹配的数量也很少(一对 100),所以替换部分不应该减慢太多。
使用的命令:
time grep -r 'home' .
real 0m0.228s
user 0m0.154s
sys 0m0.071s
time find . -type f -exec sed -i 's/home/test/g' {} \;
real 0m38.064s
user 0m8.893s
sys 0m28.552s
time find . -type f -exec sed -i 's/home/test/g' {} +
real 0m25.671s
user 0m5.654s
sys 0m19.968s
time find . -type f
real 0m0.090s
user 0m0.013s
sys 0m0.028s
这里发生了什么?有没有办法用不同的命令加速它?
【问题讨论】:
-
您在示例中比较了苹果和橙子。
-
对于初学者,
-exec sed ... {} \;为每个文件生成一个子shell,而grep -r没有。这是一篇关于为什么 GNU grep 速度快的有趣文章:lists.freebsd.org/pipermail/freebsd-current/2010-August/… -
另外,
sed -i必须复制它修改的每个文件,grep只是读取。 -
但是有没有更快的替代搜索和替换?大多数情况下,我看到人们推荐 find + sed 版本
-
@BenjaminW.: 不,它不是子shell,它是
sed子进程,与shell 无关。存在显着差异。 (如果没有那个“subshell”这个词,那么我相信你是正确的)
标签: bash performance unix sed grep