SHELL编程实现批量Netatalk字符集文件名替换
生活随笔
收集整理的這篇文章主要介紹了
SHELL编程实现批量Netatalk字符集文件名替换
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
作者:北亞數據恢復中心([url]http://www.datahf.net[/url], tel:4006505808) 前一段時間遇到一個批量修改文件名的,是一臺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”。 記得直正解決問題時,修正了好多問題,現在也想不太起來了,但思路還是可行的。暫時就這樣記錄吧。
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”。 記得直正解決問題時,修正了好多問題,現在也想不太起來了,但思路還是可行的。暫時就這樣記錄吧。
總結
以上是生活随笔為你收集整理的SHELL编程实现批量Netatalk字符集文件名替换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: petshop详解之一:PetShop的
- 下一篇: Fedora 11-Alpha试用手记