作者:田逸(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” * |