指定フォルダ以下のファイルの文字コード一括変換
id:fumokmm さんからいいネタをいただいたので、はてなでの初めての日記の練習もかねて。
ファイルの文字コードを一括変換するツールを探していたので勉強にちょうど良いと作ってみた。実行方法は以下のとおり。
1.juniversalchardet(自動文字コード判定用ライブラリ)
google codeのプロジェクト( http://juniversalchardet.googlecode.com ) からjarファイルを落としてきて、$HOME/.groovy/lib
に配置。
2.以下のスクリプトを実行
CharsetConvertor.groovy のようなファイル名で以下のスクリプトを作成。
#!/usr/bin/env groovy
assert args.size() == 2
assert args[0]
assert args[1]
dir = new File(args[0])
destenc = args[1]
detector = new org.mozilla.universalchardet.UniversalDetector(null)
dir.eachFileRecurse { file ->
if (file.file && file.path ==~ /[^.].+/) {
detector.with {
def bytes = file.bytes
reset()
handleData(bytes as byte[], 0, bytes.size())
dataEnd()
}
def encoding = detector.detectedCharset
if (encoding)
file.write(file.getText(encoding), destenc)
}
}
println "finish"
補足
実行時のパラメータは以下のとおり
- 第一引数:実行対象フォルダ
- 第二引数:置換後エンコード
ドットファイルは対象外にしています。
ディスカッション
コメント一覧
ゲンゾウさん、はてな移住おめでとうございます。
どうでもいい部分の突っ込みですいません。
私は
assert args.size() == 2 && args.every{ it }
みたいに書くのが好きです。
なるほど、確かにそれでいける。
数が多くなってもいいですしね。
ありがとうございます。