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オプションはファイルのタイムスタンプを更新しない。