批量替换超大量的html文本

有个php网站,生成的静态网页非常多,尝试用后台自带的工具去改变备案那些信息,发现无果,解决不了,于是想着自己直接写命令去替换,用了sed。。跑了一晚上,提示-bash: /bin/sed: Argument list too long,有什么办法解决吗。。目录深,文件很多,只需要改*.html

阅读 5.1k
3 个回答

本人在不久之前刚好处理过非常类似的问题,而且文件数量比你要处理的还要多,大概530多万个。对于此类问题,要在机器性能和时间效率上做平衡,如果是线下机器或者对时间要求更迫切,则必然得并发运行。以下是我在处理该问题时的一种方案:

#!/bin/bash
A=($(find . -name '*.html'))
for((i=0;i<${#A[@]};i+=10000))
do
    sed -i 's@xxxx@oooo@g' ${A[@]:$i:10000} &
done
wait

这脚本首先获得需要处理文件的数组,然后每10000个文件在后台进行处理,并且是并发。然后wait等待所有的进程结束。
对于题主的问题,50000多个文件,这么处理应该是可以的,机器性能(主要是IO性能)还可以的话,通过这种方式,应该5分钟左右就处理完了。
如果需要控制机器的负载不能太高,则可以参考这篇文章,https://segmentfault.com/a/11...,改进该脚本控制并发进程的数量。
以上。

结合find 和sed可以实现,下面写一个:递归查找目录下所有的html文件,并把文件中的“1234”字符串替换成"5678":

find    ./   -name  "*.html"  -exec  grep "1234" {} \; -exec sed -i 's/1234/5678/g' {} \;

用find查找,然后sed修改不行吗

推荐问题
宣传栏