2005年04月18日 月曜日

findメモ

この日記の記事(限りなくHTML4 Strictに近くて、ISO-2022JPで書かれているファイル)を諸般の事情により内容を再利用することを目的に、元の記事をを残しつつ、XHTML 1.0 Strict(UTF-8)に変換しようかと画策している。今回の見直しは結構大きめで、せっかくだからスタイルシートの指定も一気につもりつもりなのだ。
今日の努力で一日分の記事のファイル(index.html)について、上記の変換がshとsedとHTML Tidyでできるようになったのだが、変換したいファイルはyyyyが西暦年、mmが月、ddが日として
~/html/diary/yyyy/mm/dd/
と言うディレクトリに静的に入っている。個数を勘定(LS-lRしてindex.htmlを検索語にgrep書けて行数を数えただけ)してみたところ、1200個くらいのファイルがある。(足かけ5年分だとこのくらい?当然ディレクトリの個数がその程度ある。) さすがに手でやるのも気が遠いというか、そんなの人間のお仕事ではないので、再帰的にできないかなと思うわけだ。いったん1つのファイルを処理する適当に書いたシェルスクリプトはこんなかんじ。あんまり考えないで書いたので、動作の通りそのまんま。

#!/bin/sh
if [ -e $1.orig ] ; then
  echo "既に処理済みです"
else
  cp $1 $1.orig
  sed -e 's/www\.ymzk\.org\/~kentaro/www.dabesa.org/' \
      -e 's/diary\/diary\.css/standard.css/' \
      -e 's/ align=\"right\"/ class=\"d_footer\"/' \
      -e 's/<code><pre>/<pre><code>/' \
      -e 's/<\/pre><\/code>/<\/code><\/pre>/' $1.orig > ~/tmp/tmp1
  iconv -f ISO-2022-JP -t EUC-JP ~/tmp/tmp1 > ~/tmp/tmp2
  tidy -output ~/tmp/tmp3 -config ~/TidyConf.txt ~/tmp/tmp2
  sed -e 's/EUC-JP/UTF-8/' \
      -e 's/<pre><code>/<div class=\"code\">/' \
      -e 's/<\/code><\/pre>/<\/div>/' ~/tmp/tmp3 > ~/tmp/tmp4
  iconv -f EUC-JP -t UTF-8 ~/tmp/tmp4 > ~/tmp/$1
  rm ~/tmp/tmp[1-4]
fi

~/html/diary までは同じだから、~/html/diaryからの相対パスで変換したいファイル名のリストを作って、1つずつ食べていただけばいいのだろうか? と思ったのだが、たしか再帰的に呼び出すコマンドがあったようなと思ってTLUC-MLで質問したら、吉藤さんから「find?」と言うコメントをいただいたので、_ああ、そんな便利なコマンドあったなぁ_と思いだした。シェルスクリプトをnikki2xhtml.shとした場合、
find ~/html/diary -name index.html -exec ./nikki2xhtml.sh {} ;
とすれば良いわけだ。なんだか1年くらい前にもfindな話を聞いたのを思い出した… findは1年ぶり、sedに至っては12年ぶりだ… わすれるわなあ。と言うことでメモ。(なんか前回も吉藤さんにコメントをいただいた気がする…)