BLOG
ブログ
  • TOP
  • BLOG
  • Linuxで指定ディレクトリ配下のテキストファイルの文字コードを一括変換と一括置換

Linuxで指定ディレクトリ配下のテキストファイルの文字コードを一括変換と一括置換

Linuxで指定ディレクトリ配下のテキストファイルの文字コードを一括変換と一括置換

CONTENT

こんにちは、東京エンジニアのSWです。

今日はLinuxでテキストファイルを扱うときのテクニックを紹介します。


経緯としては、Windowsで作成された文字コードShift-JISの複数テキストファイルを、Linux環境で扱うためにUTF-8に変換したくて調べたところ、結構めんどくさかったのでその時のメモです。


■シェルコマンド

for file in *; do iconv -f SJIS -t UTF8 "$file" > "${file%}.tmp"; done

find . -type f ! -name "*.tmp" -exec rm -rf {} +

find . -type f  | sed -e s/\.tmp// | awk '{print $1 ".tmp " $1}' | xargs -n 2 mv


■解説

1. 文字コードを変換した結果を別ファイルに書き出す

for file in *; do iconv -f SJIS -t UTF8 "$file" > "${file%}.tmp"; done


まず、文字コードの変換には iconv コマンドを使います。
しかしこのコマンドは複数ファイルに対応していないので、for文を使って順繰り回してやります。また、対象ファイルを直接編集することもできないので、いったん.tmpファイルに吐き出しています。


2. 元ファイルの削除

find . -type f ! -name "*.tmp" -exec rm -rf {} +

元ファイルはもう必要ないので削除するなり、または退避するなりしてください。


3. tmpファイルからリネーム

find . -type f | sed -e s/\.tmp// | awk '{print $1 ".tmp " $1}' | xargs -n 2 mv

最後に.tmpファイルから元のファイル名にリネームしてやれば、文字コードUTF-8の状態の出来上がりです。


■おまけ

複数ファイルの文字列置換はもっと簡単にワンライナーで可能です。

find ./ -type f | xargs sed -i -e "s/before/after/g"