前一段時間遇到一個批量修改檔案名稱的,是一台debian檔案伺服器,為mac提供檔案分享權限設定服務,其中的漢字部分採用編碼方式(查了下資料,應該是的,沒有去實際驗證),具體的編碼原則如下:
一個儲存於linux伺服器中的字元名稱為Product_List:b2:fa:c6:b7:c4:bf:c2:bc,編碼方式為CP936,但已經不會有中文了。編碼的轉換方式為:後面的兩位字元就是對應CP936字元集的一個字元(半個漢字)的HEX內碼,如上面檔案名稱轉換後應該為:Product_List產品目錄,見下面轉換方式。
內碼 GB2312
00000000 B2 FA C6 B7 C4 BF C2 BC 產品目錄
00000008 00 00 00 00 00 00 00 00 ........
本案例中因儲存結構變更,需要重新整理,同時原先的MAC平台及DEBIAN平台均已報廢多久(這部分資料是存檔資料),所以需要有一種手段將檔案名稱轉換為正常的字元集。
我的思路是:先用find尋找所有的含":"的檔案或目錄名稱,再用mv將檔案名稱中的":"批量替換為"%",最後通過convmv將字元轉換為正常的CP936編碼字。
因最近整理資料時發現這個案例,很鬱悶的是,最終的程式方案已經早被我刪除了,無法恢複出來了(虧了我這個資料恢複專家的名頭了,呵呵)。只找到個草稿,先記下來,以後遇到類似情況待查。如果有更好的建議、意見,留言給我。
假設產生的sh檔案名稱為t.sh,內容大致為:
echo >/testsh/t1.sh
echo >/testsh/t2.sh
find $1 -depth -type $2 -name "*\:*" -exec $3 {} \;|while read -r linet
do
line="`echo "$linet"|sed -e 's#)#\\\\)#g' -e 's/(/\\\\(/g' -e 's/&/\\\\&/g' -e 's/:/\\\\:/g' -e "s/'/\\\\\'/g"`"
echo "mv "$line" "`echo "$line"|sed -e 's/\:/%/g' -e 's/\^M//g'`" ;" >>/testsh/t1.sh
echo "convmv --notest --unescape "`echo "$line"|sed 's/\:/%/g'`" ;" >>/testsh/t2.sh
done
chmod +x /testsh/t1.sh
/testsh/t1.sh
chmod +x /testsh/t2.sh
/testsh/t2.sh
/testsh/t2.sh
執行上面的sh 後,會產生t1.sh與t2.sh,先不斷的執行“t.sh /data_dir d echo”,等全部執行完成後,再執行“t.sh /data_dir f echo”。
記得直正解決問題時,修正了好多問題,現在也想不太起來了,但思路還是可行的。暫時就這樣記錄吧。