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"