個別の文字コードで保存されているテキストファイルをUTF-8に変換する
あるディレクトリ以下に複数のサブディレクトリがあり、その中に更に日本語、中国語のディレクトリに分かれて情報が保管されているフォルダがありました。
たとえば、こんなカンジです。
\project\ subproject1\ JP\ CN\ subproject2\ JP\ CN\
今どきはそういうファイルはUnicodeで保存されているはずですが、過去のファイルは言語ごとの個別の文字コードで保存されているので扱いが微妙に面倒です。しかも単なるテキストファイルかつ何かのシステムと連携してもいないファイルなのでまずは中国語のディレクトリのファイルをUTF-8に変換したくなったので方法を考えてみました。
もっとも単純に行おうと思ったら、ワンライナーでこういう方法です。
find . -type f -name '*.txt' | grep 'CN' | xargs -Ifilename iconv -f GB18030 -t UTF-8 filename -o filename
しかしこの方法だとファイルのタイムスタンプがすべて変わってしまいます。
ファイルの内容は文字コード変換されたことを除けば論理的に同一なのにファイルのタイムスタンプが変わっているのは不適切だと思うので、touch コマンドで次の方法に復元させつつファイルを上書きすることを考えてみました。
for filename in $( find . -type f -name '*.txt' | grep 'CN' ) ; do ls -l ${filename} iconv --from-code=GB18030 --to-code=UTF-8 ${filename} --output ${filename}.utf8 touch --reference=${filename} ${filename}.utf8 mv ${filename}.utf8 ${filename} ls -l ${filename} done