2014-03-12

簡繁互轉:批次更改資料夾及檔案名稱

Linux找不到我需要的簡轉繁批次更改資料夾及檔案名稱這種功能的程式,想說簡繁互轉有opencc能用,在來就是用zsh寫個shell script應該不會很難才是。

初步很簡單就寫好了,可是,我忽略了資料夾遇到了有多層目錄的結構,前面的名稱改了但讀進的資料不能跟著改不然會出錯。

帅哥/刚才/叫我吗 要修改成 帥哥/剛才/叫我嗎,修改順序為第一層 帅哥/帥哥,出現錯誤在第二層中他是讀到舊的 帅哥/刚才 ,但是 帅哥 已經變成繁體字的 帥哥,那麼接下來的結構都會出現錯誤。

今過幾天思考到底要怎麼處理,結果給我想到了,我將有層次目錄結構分讀取資料分兩段讀取轉換,我用 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 有興趣的可以下載回去看一下。