Linux: 轉換 檔案名稱 的編碼 convmv (UTF-8/Big5 互轉)

當整個目錄裡面都是 Big5 的檔案, 然後要全部轉成 UTF-8 的時候, 想到就很累, 這就是當初要把 Terminal 都轉換成 UTF-8 其中一個障礙.

不過那時候找到一隻 script, 程式寫法大概就是 echo 現在的檔名, 然後用 iconv 轉成 UTF-8, 再 mv 把檔名換掉.

程式如下: (已不知來源為何, 若有人知道, 還請告知此程式來源, 將立即補上)

#!/bin/sh
# this script changes big5 chinese file/directory name to utf8 file/directory name.
# It will recursive.
# it can handle the file name containing space.
# when you use this script, please change to the directory that you want to transfer files' name.
# then execute like "~/ic2"
# i hope this script will not impact anything that will crash your system.
# this script works fine for me.

DIR="."

for I in * ; do
    echo "check... $I"
    f=`echo "$I" | iconv -f big5 -t utf8`
    if [ $? = 0 ]; then
        if  [ "$I" != "$f" ];then
            echo "$f"
#            cp -rv "$I" ~/cbackup/
            mv -v "$I" "$f"
            if [ $? = 0 ];then
                rm -rfv ~/cbackup/"$I"
            else
                echo "$f"
                exit 1;
            fi
        else
            echo "skip $I"
        fi
    else
        echo "skip $I"
    fi
done
echo "ok!"

#following from cynosure
for J in * ; do
    if [ -d "$J" ]
    then
        path=`pwd`
        echo "dir ""$J" #where am i
        cd  "$path""/""$J"
        ~/bin/ic2
        cd "$path"
    fi
done
ls *
exit 1;

此 script 我有做過一些修改, 會直接執行, 不會進行備份或測試的動作, 所以建議不熟先不要亂玩.. 😛

我有另外將此 script 再 cp, 主要是來做還原等等的 script, 主要都是 copy 後修改 iconv, 來做事後處理, 例如:

  • iconv -f big5 -t utf8
  • iconv -f utf8 -t big5
  • iconv -f gb2312 -t utf8
  • iconv -f utf8 -t gb2312

不過現在有另外一隻更方便的程式囉~ 就是下述:

這隻主要是隻 Perl script, 該做 轉換/備份/測試/偵測環境 等等, 都寫的蠻完整的.

convmv 轉換編碼指令

  • convmv -f big5 -t utf-8 -r --notest *
  • -f big5: 從 Big5 編碼轉換 (不過標準應該是要寫 big5-eten, 但是我測試 big5 也可以動. :P)
  • -t utf-8: 轉換編碼到 UTF-8
  • -r: 遞迴的將目錄下的所有檔名都做轉換
  • --notest: 如果不下這個, 一切動作都只是測試, 會直接將轉換前和轉換後的檔名列給你看, 這加下去, 才會實際轉換檔名.
  • *: 所有檔案

其他參數

  • --list : 列出所有可用的編碼
  • --unescape : 轉換檔名中 %xx 這種 16 進位的編碼 (mv "./a%20x.jpg" "./a x.jpg")
  • --lower : 將所有檔名都轉小寫(ex: convmv --lower LOWER.txt)
  • --upper : 將所有檔名都轉大寫
  • -i : 互動模式, 轉換前會先經過 y/n 確認
  • 更多詳細可 man convmv 或 convmv --help, 除此之外, 可以另外再搭配 rename 做些其他應用~ 🙂

相關網頁


關於 Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.
本篇發表於 News-Unix。將永久鏈結加入書籤。

Linux: 轉換 檔案名稱 的編碼 convmv (UTF-8/Big5 互轉) 有 3 則回應

  1. bcswlmpke 說道:

    Hi, 您好:
    雖然不曉得這個問題在這邊問適不適合,
    但是剛好搜尋到 iconv 看到您的文章,
    想請教您,隨身碟的 LABEL 名稱如果是中文,
    在 linux 下可以正常顯示嗎?
    我用 ntfslabel /dev/sda1 查詢 label 名稱,
    如果我隨身碟的 LABEL 是中文,
    例如:測試_8G,
    則查詢後的結果為 ____8G。
    因為我不曉得 ntfslabel 查詢後顯示出來的字串是 Unicode or Big5 or ...,
    我想說用 iconv 試著 big5 -> utf-8,
    但是都不成功。
    所以想請教您是否有何建議?
    謝謝

  2. Tsung 說道:

    厄, 我的隨身碟, 沒有這個問題耶.
    還是你把 Label 改為英文就好了? 或者 mount 時加 iocharset=cp950 這個參數試試?

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料