linux - 批量替换超大量的html文本
PHP中文网
PHP中文网 2017-04-17 16:46:42
[Linux讨论组]

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

PHP中文网
PHP中文网

认证0级讲师

全部回复(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' {} \;
PHP中文网

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号