用SHELL指令碼批量替換Netatalk字元集檔案名稱

來源:互聯網
上載者:User

前一段時間遇到一個批量修改檔案名稱的,是一台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”。

記得直正解決問題時,修正了好多問題,現在也想不太起來了,但思路還是可行的。暫時就這樣記錄吧。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.