作者:田逸(formyz)
需求描述
有一个网站,因为域名变更,除了需要重新做域名解析外,还需要对网站目录的包含原域名的文件进行替换。包含域名(主机名)关键字的文件相当的多,它们分布在不同目录的以html、php、phtml 结尾的文件中。数千个文件,如果手工来替换,根本无法完成,因此,使用shell是不二之选。
基本思路
总体上分两步进行:
1、文件查找。将网站所在根文档目录包含关键字域名的文件全部查找出来;
2、在查找出来的文件中进行全文替换。
因为此操作具有很大的风险性,需要事先做一个模拟测试,即准备一个临时目录,从网站根文档所在的目录复制少许文件及目录,这些文件及子目录的文件包含欲修改域名的关键字。先用find质量查找所有文本文件,然后进行域名关键字匹配并全部替换。
虽然查出来的文件,有些可能并不包含需要替换的域名关键字,但可以通过匹配的方式,把未包含域名关键字的文件过滤掉,我这里使用的工具是sed。
撰写脚本
脚本由指令find、sed及for循环构成,其内容十分简单,全部内容如下所示:
#!/bin/bash file_list=` find /tmp/formyz/ -name "*.php" -o -name "*.html" -o -name "*.phtml"` for i in $file_list do sed -i 's#formyz.cn#formyz.com#g' $i done |
#!/bin/bash
file_list=` find /tmp/formyz/ -name "*.php" -o -name "*.html" -o -name "*.phtml"`
for i in $file_list
do
sed -i 's#formyz.cn#formyz.com#g' $i
done
实施替换
考虑到风险问题,需按步骤逐一进行。
1、执行指令 sh -n /usr/bin/modify.sh 进行语法检查,确认脚本的书写正确性;
2、去掉选项“-n”,真正使脚本运行起来;
3、查验脚本运行结束后,测试目录“/tmp/formyz”里边的文本是否被替换。
4、修改脚本,将find 查找目录改成网站根文档所在的路径。任然先执行带选项“-n”的操作,检查一遍语法;
5、进入screen环境(避免远程ssh中断、shell也因此中断),真正执行脚本,完成替换。
结果验证
通过两个方向来验证替换的正确性及有效性。
1、查验网站根文档下,是否还存在原域名的关键字,指令如下:
grep -r “formyz.cn” * |
没有任何匹配输出,为合格。
2、查验网站根文档下,是否存在替换后的域名关键字,指令如下:
grep -r “formyz.com” * |