背景
在维护网站或迁移服务时,批量修改域名引用是常见需求。而今天收到领导的需求是之前存在的老旧网页内容放的网址还是之前.cn结尾的,现在需要全部修改为.com结尾。例如将旧域名chenxianlin.cn全站替换为新域名chenxianlin.com。
当前环境
实现思路
递归搜索机制
find .
从当前目录开始深度遍历
-type f
过滤掉目录,仅处理文件
-name "*.html"
限定HTML文件类型
安全替换技巧
# 注意转义点字符
sed -i 's/chenxianlin\.cn/chenxianlin.com/g' {} +
# -i: 直接修改文件(危险操作!)
# +: 参数批量处理,比-exec更高效
风险控制
防御性操作流程
步骤1:模拟运行(不实际修改)
find . -name "*.html" -exec sed -n 's/chenxianlin\.cn/chenxianlin.com/gp' {} \; | wc -l
# -exec: 表示要执行的命令,这里 \; 意思是执行的命令结束
执行结果为统计影响的行数,下图中命令分别打印出了统计行数与内容
步骤2:先备份后执行
find . -name "*.html" -exec cp {} {}.bak \; -exec sed -i "s/chenxianlin\.cn/chenxianlin.com/g" {} \;
# 这里两个-exec表示两个执行命令
图中可以看出从最开始的chenxianlin.cn都变成了chenxianlin.com,而且每个html都有各自的.bak备份文件。
常见问题排查
权限错误:添加sudo或调整文件权限
编码乱码:指定sed -i -E支持扩展正则
进阶应用场景
多域名替换
find . -name "*.html" -exec sed -i -E 's/(chenxianlin|www-stream.2345cdn)\.(cn|com|net)/chenxianlin.com/g' {} \;
先用grep看下执行之前的数据,再执行替换,我这里只替换当前目录的index.html文件 find . -name "index.html" -exec sed -i -E 's/(chenxianlin|www-stream.2345cdn)\.(cn|com|net)/forest.com/g' {} \;
,最终查看结果