Linuxコマンドでファイル名の文字コードをまとめて変換
現在、ほとんどのLinuxディストリビューションやMacOSでは、UTF-8でファイル名を表現していますが、古いOSだとEUCだったり、Windows系だとShift-Jisベースで表現されています。
今回、CentOS4系で作成したファイル名が日本語のファイルを、まとめてCentOS6系で使えるようにする必要がありました。
つまり、EUC => UTF-8のファイル名変換です。
検索すると、convmvというperlスクリプトで行うのが一般的なよう。
しかし、試してみるとだいぶ精度が低く、うまく変換できていないファイルが多々あったたため、これはちょっと使えないなぁという結論に。
というかもう、nkfでできるのでは?と思って試したところ、
できました。
#!/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