linux - 批量替换超大量的html文本

 ik人生如梦场 发布于 2022-10-30 11:12

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

3 个回答
  • 用find查找,然后sed修改不行吗

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

    find    ./   -name  "*.html"  -exec  grep "1234" {} \; -exec sed -i 's/1234/5678/g' {} \;
    
    2022-10-31 21:14 回答
  • 本人在不久之前刚好处理过非常类似的问题,而且文件数量比你要处理的还要多,大概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...,改进该脚本控制并发进程的数量。
    以上。

    2022-10-31 21:15 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有