SHELL程式設計實現批量Netatalk字符集檔名替換
前一段時間遇到一個批量修改檔名的,是一臺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 ........
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
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,如需轉載請自行聯絡原作者
相關文章
- 批量修改檔名 與 批量檔案字元替換字元
- grep、sed批量替換檔案內容shell
- Linux Shell程式設計(28)——程式替換Linux程式設計
- Linux Shell程式設計(24)——命令替換Linux程式設計
- Linux Shell程式設計(6)——變數替換Linux程式設計變數
- shell替換程式碼
- perl命令:批量修改替換檔案
- shell替換程式裡的程式碼
- 程式設計方式實現MySQL批量匯入sql檔案程式設計MySql
- vim的批量替換
- node實現檔案屬性批量修改(檔名)
- mysql批量替換指定字串MySql字串
- VI中的批量替換
- 批量修改檔名實踐
- shell程式設計例項--實現累加程式設計
- Linux Shell程式設計(30)——別名Linux程式設計
- mysql型別批量替換工具MySql型別
- IP別名\替換IP
- 批量修改檔名
- Matlab批量實現圖片檔案格式轉換Matlab
- 用python批量替換MD檔案中的圖片地址Python
- Linux下批量替換檔案中的字元 - sed (stream editor)Linux字元
- 【shell程式設計】目錄檔案計數程式設計
- linux中批量替換文字中字串Linux字串
- pandas列值根據字典批量替換
- 使用變數替換批量部署GoldenGate變數Go
- java批量修改檔名Java
- 【Perl程式設計-6】正規表示式--替換+轉化程式設計
- Linux系統程式設計之程式替換:exec 函式族Linux程式設計函式
- rhel5 vi 批量替換匹配的字串字串
- AIX/Linux下批量替換某類檔案中的某串字元AILinux字元
- Shell轉義字元與變數替換字元變數
- 替換專案中的包名
- shell程式設計程式設計
- 實現最簡單的模板替換
- 如果程式設計替換成中文就會怎樣? 程式設計師看了表示頭疼程式設計師
- Linux Shell程式設計(1)——shell程式設計簡介Linux程式設計
- 快速批量修改檔名[機器學習]機器學習