SHELL程式設計實現批量Netatalk字符集檔名替換

weixin_33858249發表於2017-11-15
  前一段時間遇到一個批量修改檔名的,是一臺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
 
 
  執行上面的sh 後,會生成t1.sh與t2.sh,先不斷的執行“t.sh  /data_dir d echo”,等全部執行完成後,再執行“t.sh  /data_dir f echo”。
 
    記得直正解決問題時,修正了好多問題,現在也想不太起來了,但思路還是可行的。暫時就這樣記錄吧。




本文轉自 張宇 51CTO部落格,原文連結:http://blog.51cto.com/zhangyu/136416,如需轉載請自行聯絡原作者

相關文章