我正在尝试在存储库(大约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
这里发生了什么?无论如何都要用不同的命令来加速它?
答案 0 :(得分:1)
慢速部分可能sed
重写每个文件 - 它必须为每个文件执行此操作,即使是不匹配的文件也是如此。如果大多数文件不匹配,您应该能够通过使用grep
生成匹配文件列表(您知道这很快)来加快速度,然后将其提供给{{1}重写它们。
sed
grep -r -l 'home' . | while read -r filename; do
sed -i 's/home/test/g' "$filename"
done
的{{1}}选项告诉它只打印匹配的文件名。
如果你正在使用GNU -l
,你可以使用grep
选项来终止文件名,从而使这更安全,更高效。然后包含换行符的文件名不会成为问题。
grep