読者です 読者をやめる 読者になる 読者になる

Web・IT うんたらら

業務系とWeb系の狭間でIT業界を彷徨いながら備忘録と足跡を残していきます

Linuxコマンドでファイル名の文字コードをまとめて変換

Linux

現在、ほとんどのLinuxディストリビューションMacOSでは、UTF-8でファイル名を表現していますが、古いOSだとEUCだったり、Windows系だとShift-Jisベースで表現されています。
今回、CentOS4系で作成したファイル名が日本語のファイルを、まとめてCentOS6系で使えるようにする必要がありました。
つまり、EUC => UTF-8のファイル名変換です。

検索すると、convmvというperlスクリプトで行うのが一般的なよう。
しかし、試してみるとだいぶ精度が低く、うまく変換できていないファイルが多々あったたため、これはちょっと使えないなぁという結論に。

というかもう、nkfでできるのでは?と思って試したところ、

できました。


以下、bashシェルスクリプトです。

#!/bin/bash

if [ $# -lt 2 ]; then
    echo "Usage: $0 {-w|-e|-s} file" 1>&2
    echo "       -w: UTF8  -e: EUC  -s: Shift_Jis" 1>&2
    exit 0;
fi

for target in ${@:2};
do
    find ${target} -maxdepth 1 -type f | while read line
    do src=`echo ${line}` ;
      dest=`echo ${line} | nkf $1` ;
      if [ "${src}" = "${dest}" ];
      then
          echo "SKIP ${src}" ;
      else
          mv "${src}" "${dest}";
          echo "RENAME \"${src}\" TO \"${dest}\"";
      fi ;
    done
done


第1パラメータにnkfのオプションを渡し、それをそのまま使います。
第2パラメータにファイル名やディレクトリ名を渡します。findで読み取れるならなんでも可。
詳細はUsageの部分を参照。

例として、./hogeフォルダ内にあるテキストファイルのファイル名をUTF-8に変換したい場合は以下のようにします。

./nkf_rename.sh -w hoge/*.txt 


一応、githubに置いておきますね。
https://github.com/vamview/nkf_rename