初步很簡單就寫好了,可是,我忽略了資料夾遇到了有多層目錄的結構,前面的名稱改了但讀進的資料不能跟著改不然會出錯。
帅哥/刚才/叫我吗 要修改成 帥哥/剛才/叫我嗎,修改順序為第一層 帅哥/帥哥,出現錯誤在第二層中他是讀到舊的 帅哥/刚才 ,但是 帅哥 已經變成繁體字的 帥哥,那麼接下來的結構都會出現錯誤。
今過幾天思考到底要怎麼處理,結果給我想到了,我將有層次目錄結構分讀取資料分兩段讀取轉換,我用 dh 保留路徑的頭,dt保留路徑的尾巴,遇到這情形到第二層目錄先將 dh 轉為 ch讓他讀到繁體的,最後整體會變成 ch/ct這樣搬移時就沒問題了。
以下是我的原始碼大家研究一下囉,請記得要裝opencc即zsh呀否則無法正確執行;程式會自動轉換當前資料夾內所有子資料夾及檔案,所以請先切換到要目地在執行哦。
opencc 我是用 -c zhs2zhtw_vp.ini 簡體轉繁體,大陸的朋友要繁體轉簡體的話要用 -c zhtw2zhcn_s.ini 哦。
將原始碼存檔之後給執行權限執行即可。
#!/bin/zsh
test -e "conv.log" && rm "conv.log"
touch "conv.log"
for direct in **/*(/)
do
dh="$direct:h"
dt="$direct:t"
ch="$(echo "$dh"|opencc -c zhs2zhtw_vp.ini)"
ct="$(echo "$dt"|opencc -c zhs2zhtw_vp.ini)"
if [ "$dt" != "$ct" ]
then
if [ "$dh" != "." ]
then
echo "$dh/$dt" "$ch/$ct" >> "conv.log"
mv "$ch/$dt" "$ch/$ct"
else
echo "$dt" "$ct" >> "conv.log"
mv "$dt" "$ct"
fi
fi
done
for files in **/*(.)
do
convfile="$(echo "$files" | opencc -c zhs2zhtw_vp.ini)"
if [ "$files" != "$convfile" ]
then
echo "$files" "$convfile" >> "conv.log"
mv "$files" "$convfile"
fi
done
最後附上我實際轉換過程的log 有興趣的可以下載回去看一下。
參考資料: OpenCC支持地區用詞轉換了 - BYVoid