pslaboが試したことの記録

はてなダイヤリーからはてなブログに引っ越してきました

この日記は現在実行中の減量記録を含む個人的なメモとして始めましたが、最近はコンピュータやガジェット、ハック、セキュリティネタのほうがメインになっております。

はてなダイヤリー時代はカテゴリ分けが適当だったのですが、これはそのうち直します。


個別の文字コードで保存されているテキストファイルを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