• 巧用shell脚本批量替换字符串


    作者:田逸(formyz)

    需求描述

    有一个网站,因为域名变更,除了需要重新做域名解析外,还需要对网站目录的包含原域名的文件进行替换。包含域名(主机名)关键字的文件相当的多,它们分布在不同目录的以html、php、phtml 结尾的文件中。数千个文件,如果手工来替换,根本无法完成,因此,使用shell是不二之选。

     

    基本思路

    总体上分两步进行:

    1、文件查找。将网站所在根文档目录包含关键字域名的文件全部查找出来;

    2、在查找出来的文件中进行全文替换。

     

    因为此操作具有很大的风险性,需要事先做一个模拟测试,即准备一个临时目录,从网站根文档所在的目录复制少许文件及目录,这些文件及子目录的文件包含欲修改域名的关键字。先用find质量查找所有文本文件,然后进行域名关键字匹配并全部替换。

    虽然查出来的文件,有些可能并不包含需要替换的域名关键字,但可以通过匹配的方式,把未包含域名关键字的文件过滤掉,我这里使用的工具是sed

    撰写脚本

    脚本由指令find、sed及for循环构成,其内容十分简单,全部内容如下所示(/usr/bin/modify.sh):

    #!/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. #!/bin/bash
    2. file_list=` find /tmp/formyz/ -name "*.php" -o -name "*.html" -o -name "*.phtml"`
    3. for i in $file_list
    4. do
    5. sed -i 's#formyz.cn#formyz.com#g' $i
    6. done
    7. exit 0

     

    实施替换

    考虑到风险问题,需按步骤逐一进行。

    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” *

     

  • 相关阅读:
    【ArcGIS Pro二次开发】(65):进出平衡SHP转TXT、TXT转SHP
    vulfocus——struts2-cve_2017_9791
    【Hack The Box】linux练习-- Blocky
    如何在three.js中画3D圆弧及半圆弧组成圆
    RocketMQ第二话 -- RocketMQ事务消息、延时消息实现
    十一、MySQL日志
    基于nodejs+vue 校园通勤车系统
    <单链表及模拟实现>——《Data Structure in C Train》
    PHP调用电商API接口的方法及实现
    类和对象(上)--关于面向对象,类的定义,访问限定符,this指针
  • 原文地址:https://blog.csdn.net/solore/article/details/127654669