メモの日々


2009年04月10日(金) [長年日記]

[shell] 更新されたファイルだけを文字コード変換

g++の-finput-charsetオプションを使うのはやめて、ビルド時に文字コード変換をするようにした。

更新されたファイルだけを文字コード変換するBashスクリプトを書いたのでメモしておく。

SRC_DIR2=src_utf8
mkdir -p $SRC_DIR2
cd src
for path in `find * -name '*.h' -o -name '*.cpp'`; do
    if [ $path -nt ../$SRC_DIR2/$path ]; then
        cp --parents --update -p $path ../$SRC_DIR2/
        nkf --ic=CP932 --oc=UTF-8 --overwrite ../$SRC_DIR2/$path
    fi
done

不格好。

  • srcディレクトリの親ディレクトリで実行する。src配下の拡張子がhまたはcppのファイルを\$SRC_DIR2にコピーし文字コードを変換する。ただし、コピーするのは\$SRC_DIR2にあるファイルよりも新しいものだけ。
  • [ file1 -nt file2 ] でfile1がfile2よりも新しいかを判定できる。(http://www.linux.or.jp/JM/html/GNU_bash/man1/bash.1.html#lbBR
  • cpは--parentオプションを付けると親ディレクトリ付きでコピーしてくれる。また、--updateオプションを付けるとファイルが新しい場合だけコピーするようになる。その前のif文で判定しているんだから--updateは不要か。
  • nkfの--overwriteオプションはファイルのタイムスタンプを更新しない。