foreach newf ( $datad/*.html )この疑似コードの最初のコメント部分に書いたように、変数 newf には、
# $datad 内のファイル $newf と、これと同じファイル名の
# $oldd 内のファイルとを diff で比較し、その結果を
# $tmpf に保存する
if ( ! -z $tmpf ) then
# 違いあり
else
# 違いなし
endif
end
"~/wwwcheck/data/2.html"のような値 (ファイルパス) が入っていますから、 ここからディレクトリ名を抜きとった ``2.html'' というファイル名のみを取り出して、 $oldd/2.html と $newf を diff で比較しなければいけません。
このように、ファイルパスからファイル名のみを取り出したり、 ディレクトリ部分のみを取り出すには、 basename, dirname という Unix 標準コマンドを使用します:
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 ができあがります。
竹野茂治@新潟工科大学