4 wwwcheck2.csh スクリプト

wwwcheck2.csh は、2 節の 3., 4. にあるように、 2 つのディレクトリ $oldd$datad のファイルを 比較すればいいのですが、 ここでは diff で一つ一つ対応するファイルを比較する必要があるので、 ファイルパスからファイル名部分を取り出す必要があります。 以下に、簡単な疑似コードを上げて説明します。
foreach newf ( $datad/*.html )
    # $datad 内のファイル $newf と、これと同じファイル名の
    # $oldd 内のファイルとを diff で比較し、その結果を
    # $tmpf に保存する
    if ( ! -z $tmpf ) then
        # 違いあり
    else
        # 違いなし
    endif
end
この疑似コードの最初のコメント部分に書いたように、変数 newf には、
"~/wwwcheck/data/2.html"
のような値 (ファイルパス) が入っていますから、 ここからディレクトリ名を抜きとった ``2.html'' というファイル名のみを取り出して、 $oldd/2.html$newf を diff で比較しなければいけません。

このように、ファイルパスからファイル名のみを取り出したり、 ディレクトリ部分のみを取り出すには、 basename, dirname という Unix 標準コマンドを使用します:

これらの出力は標準出力なので、 csh スクリプトでは ` ` (バッククォート) を使って その出力を取得できます:
set fname = `basename $newf`
set oldf = $oldd/$fname

ファイルに違いがあった場合の実際の作業は、 それらのファイル名 ($newf) をリストの要素とする リスト変数を作っておきます。 最後にそれを引数としてブラウザに渡して実行するわけです。 このリスト変数の作成は、foreach の前に、

set newflist = ( )     # 空リスト
を入れて、foreach の if ブロックに
set newflist = ( $newflist $newf )
とすればいいでしょう。 右辺のカッコ内の最初の要素は、このリスト変数自体の名前になっていますが、 これは直前に設定されているこのリスト変数の値 (各要素をスペース区切りで並べた文字列) で、 その最後に $newf を追加したことになりますので、 これで順次違いのあった $newf が要素として追加されていくことになります。

また、今回は違いがない場合は特に何もする必要がないので、 疑似コードの else ブロックは不要です。

なお、上の疑似コードでは、 $oldd 内に $fname という名前のファイルが存在するとして 書いていますが、実際にはそうではない場合もありえます。 例えば URL リストファイルに新たな URL を追加した後に wwwcheck1.csh を実行すると、 前回は取得してないのに今回は取得した、 というファイルができることになりますから、 この場合は $oldd 内にはそれに対応するファイルはありません。 この場合も $newf は一応更新されていると見て、 これも newflist に追加することにします。

以上をまとめると、ほぼ以下のようになります:

set newflist = ( )
foreach newf ( $datad/*.html )
    set fname = `basename $newf`
    set oldf = $oldd/$fname
    if ( -f $oldf ) then
        diff $oldf $newf > $tmpf
        if ( ! -z $tmpf ) then
            set newflist = ( $newflist $newf )
        endif
    else
        set newflist = ( $newflist $newf )
    endif
end

diff の外側に、``-f $oldf'' による if 文を追加していますが、 ``-f file'' は、file が存在するときに真となる式なので、 $oldf が存在すれば diff で違いを調べ、 存在しなければ else ブロックで newflist に $newf を 追加することになっています。

これに初期設定を追加すればほぼ wwwcheck2.csh ができあがります。

竹野茂治@新潟工科大学
2008年1月24日