16 11月 2007

Linux iconv遞迴轉換資料夾底下的檔案編碼

在Linuxl底下有個好用的轉編碼的小工具 - iconv
不過,這個iconv只能拿來轉單一個檔案,並不能直接指定一個資料夾下去遞迴轉換。所有當有大量的檔案需要轉編碼時,就變得有點麻煩了。還好Linux強大的shell指令,可以幫忙解決這個問題,而解決的曙光就來自於find!
find -type f -exec iconv --verbose -f BIG-5 -t UTF-8 {} -o {}.result \;  \
-exec mv {} {}.bak \; \
-exec mv {}.result {} \;

以上這段指令分三個階段執行,
  1. 將目前所在的資料夾的檔案找出,丟給iconv執行轉碼,先將結果暫存至{原檔名}.result
  2. 將原本的檔案,改名為{原檔名}.bak
  3. 再將剛暫存的{原檔名}.result,改名稱{原檔名}

iconv的簡介
-l 列出所有支援的編碼格式
-f 要轉換的來源編碼
-t 要轉換的結果編碼
-o 輸出結果的檔案
--verbose 列出處理的檔案名稱


find的簡介
-type [option] 想找出的檔案類型
  • f : 正規的檔案
  • d : 資料夾
-exec [command] 執行指定的command
  • 所有在exec之後的參數,都會被當成是該command的參數,直到 '\;' 符號出現為止
  • 正在處理的檔案名稱,以'{}'取代
-print 印出正在處理的檔名


%% 奇怪的事又發生了,我是使用Ubuntu,shell是tcsh,直接執行「find -type f -exec iconv --verbose -f BIG-5 -t UTF-8 {} -o {}.result \;」,結果檔並不會產生,真的是很奇怪,一定要三部分一起寫才有用,有高手可以跟我解釋一下嗎>_<

沒有留言: