Linux上用shell批量把檔案的編碼從gb2312轉到utf8
背景:專案中用vba寫的SQL指令碼生成工具,生成的SQL裡面含有漢字,檔案編碼全是GB2312。上傳到linux伺服器上,orcale的字符集設定是utf8,用sqlplus執行的時候,日誌中的漢字亂碼,SQL中漢字更新到DB中也是亂碼,發現需要把檔案轉成utf8。改VBA工具來不及了,只好藉助shell了。
思路:正好有一些需要批量替換的schema之類的,一起用Shell實現了。Linux中可以用iconv來實現檔案轉碼,試了一下,伺服器(centos6.9)上正好安裝了。就基於iconv來實現了。想這是先把檔案列表列出來,再通過檔案列表每個檔案進行轉換。由於iconv命令引數比較多,而且是輸出到標準輸出的,只能每個檔案單獨執行。選擇把列表直接轉成shell檔案,來執行。
實現:
#!/bin/sh #把資料夾名字改一下 mv sql sql_owner #複製出一份SQL作為備份 cp sql_owner sql_utf8 -Rf #生成所有檔案列表 ls sql_owner/exp/*.sql -1 > sqllist #複製一份檔案列表 cp sqllist sqlutf8 #替換複製後的檔名路徑 sed -i "s/sql_owner/ > sql_utf8/g" sqlutf8 #把原檔名的路徑替換成 iconv的命令及引數 sed -i "s/sql_owner/iconv -f gb2312 -t utf8 sql_owner/g" sqllist #把兩個檔案按行合併到一起,用tab分開,輸出到u.sh檔案中 paste sqllist sqlutf8 > u.sh #給u.sh加執行許可權 chmod 777 u.sh #執行u.sh ./u.sh #刪除中間檔案 rm u.sh sqlutf8 sqllist #刪除備份的檔案 rm sql_owner -Rf #把轉換成utf8的檔案所在資料夾改會sql mv sql_utf8 sql
經驗:
1,在linux上檢視檔案編碼。可以使用file命令,會輸出檔案編碼。 vim 中可以在命令模式下輸入 set fileencoding,顯示檔案編碼。
2,centos下,vim顯示utf8以外的編碼的檔案會亂碼。可以通過編輯 ~/.vimrc ,追加可識別的檔案編碼。
例如:set encoding=utf-8 fileencodings=ucs-bom,utf-8,cp936
這樣vim就能識別GBK編碼的檔案了。
3,vim開啟檔案直接用:set fileencoding=utf-8也可以直接把檔案轉成utf-8。