前一段時間遇到一個批量修改文件名的,,是一臺debian文件服務器,為mac提供文件共享服務,,其中的漢字部分采用編碼方式(查了下資料,,應該是的,沒有去實際驗證),,具體的編碼原則如下:
一個存儲于linux服務器中的字符名稱為Product_List:b2:fa:c6:b7:c4:bf:c2:bc,,編碼方式為CP936,但已經(jīng)不會有中文了,。編碼的轉(zhuǎn)換方式為:后面的兩位字符就是對應CP936字符集的一個字符(半個漢字)的HEX內(nèi)碼,,如上面文件名轉(zhuǎn)換后應該為:Product_List產(chǎn)品目錄,見下面轉(zhuǎn)換方式,。
內(nèi)碼 GB2312
00000000 B2 FA C6 B7 C4 BF C2 BC 產(chǎn)品目錄
00000008 00 00 00 00 00 00 00 00 ........ 本案例中因存儲結構變更,,需要重新整理,同時原先的MAC平臺及DEBIAN平臺均已報廢多久(這部分數(shù)據(jù)是存檔數(shù)據(jù)),,所以需要有一種手段將文件名稱轉(zhuǎn)換為正常的字符集,。
我的思路是:先用find查找所有的含":"的文件或目錄名稱,再用mv將文件名中的":"批量替換為"%",最后通過convmv將字符轉(zhuǎn)換為正常的CP936編碼字,。
因最近整理資料時發(fā)現(xiàn)這個案例,,很郁悶的是,最終的程序方案已經(jīng)早被我刪除了,無法恢復出來了(虧了我這個數(shù)據(jù)恢復專家的名頭了,,呵呵),。只找到個草稿,先記下來,,以后遇到類似情況待查,。如果有更好的建議、意見,,留言給我,。
假設生成的sh文件名為t.sh,內(nèi)容大致為:
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
執(zhí)行上面的sh 后,,會生成t1.sh與t2.sh,,先不斷的執(zhí)行“t.sh /data_dir d echo”,等全部執(zhí)行完成后,,再執(zhí)行“t.sh /data_dir f echo”,。
記得直正解決問題時,修正了好多問題,,現(xiàn)在也想不太起來了,,但思路還是可行的。暫時就這樣記錄吧,。
|
|