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

はてブロ@ama-ch

https://twitter.com/ama_ch

カレントディレクトリ以下すべてのファイルの文字コードを変換する

Program シェルスクリプト

Macを使い始めてから、文字コードに悩まされる機会が増えました。ファイルを貰ったりすると、大抵EUCやShift-jisでうまく表示できません。各エンコーディングに対応しているエディタを使えば読むことはできますが、やっぱりターミナル上で表示できないと不便です。


対策として、iconvコマンドを使うとエンコーディングを変換することができます。
例えばtest.txtというファイルをeuc-jpからutf-8に変換したい場合、

$ iconv -f euc-jp -t utf-8 test.txt > test_utf.txt

このようにできます。

この方法の問題点

  • ファイル名を変更しないといけない
    • 同じ(変換元の)ファイル名をそのままリダイレクトする*1と、ファイルの中身が空っぽになる
  • 1度に1つのファイルしか変換できない


大量のファイルを変換したい場合は、以下のようなシェルスクリプトを利用すると便利です。

#!/bin/sh
for file in `find . -type f`;
do
    echo $file
    iconv -f euc-jp -t utf-8 $file > tmpfile
    mv tmpfile $file
done
exit

"find . -type f"でカレントディレクトリ以下の全てのファイルを取得し、それぞれに対してiconvコマンドを実行します。


実行結果

$ # 変換前の表示確認
$ head test.txt 
########################
######EUC#ǽ񤫤###########
$ chmod 755 convert.sh
$ ./convert.sh
./test.txt
./conf/je/c_corr
./conf/je/e_conv
./conf/je/e_kaku
./conf/je/e_sent
--- 中略 ---
./travel/text-j/textfile3416.jpn
./travel/tool/batch_mkorg.eng
./travel/tool/batch_mkorg.jpn
./travel/tool/bmj
./travel/tool/mkorg.csh
$ # 変換後の表示確認
$ head test.txt 
ちゃんと変換できるかな?
これはEUCで書かれているよ!
iconv test.
$

ちゃんと変換できましたね!

*1:こんな感じ→「$ iconv -f euc-jp -t utf-8 test.txt > test.txt」