Time-Stamping : タイムスタンプインターネットから情報をミラーリングする上で重要な点の 1 つが、ローカルなアーカイブの更新です。 次の 2 つの条件のいずれかに当てはまるとき、そのファイルは新しいと見なされます。
この機能を実装するためには、プログラムはリモートとローカルの両方のファイルの最終更新日時を知らなくてはなりません。このような情報を「タイムスタンプ」と呼びます。 GNU Wget のタイムスタンプを有効にするには、 ローカル ファイルが存在しない、またはファイルサイズが一致しない場合、Wget はタイムスタンプに関わらずリモート ファイルをダウンロードします。 タイムスタンプの使い方タイムスタンプの使い方は簡単です。 Wget に、更新日時を記憶してファイルをダウンロードしたいと伝えればいいのです。
数日後、リモート ファイルが変更されたかどうかを調べ、変更されていたらダウンロードしたくなるでしょう。
Wget はサーバーに最終更新日時を問い合せます。ローカル ファイルが新しければ、リモート ファイルを再取得することはありません。しかし、リモート ファイルのほうが新しければ、Wget は通常通りの取得を行います。 FTP についても同じです。たとえば、
ls を使えば、リモート サーバー上の状態にしたがってタイムスタンプがセットされたことが確認できるでしょう。 Wget は、HTTP と FTP のいずれから取得する場合でも、時間情報が得られれば、( もし GNU アーカイブを毎週ミラーリングしたいのであれば、次のコマンドを毎週実行すればいいでしょう。
HTTP タイムスタンプHTTP のタイムスタンプは Last-Modified ヘッダをチェックすることで実現されています。 HTTP 経由でファイル foo.html を取得するとき、Wget はローカルに foo.html が存在するかどうかを調べます。存在しなければ、無条件で foo.html を取得します。 ローカルにファイルが存在しなければ、Wget はまずローカルのタイムスタンプ ( Wget は、リモートとローカルのどちらのファイルの変更日時がより最近であるかを知るために、Last-Modified ヘッダを調査します。リモート ファイルのほうが新しければ、そのファイルがダウンロードされます。古ければ処理を中断します (*1)。 理論上は、HTTP タイムスタンプの実装は If-Modified-Since リクエストを使って行うべきでしょう。 -- 脚注 -- FTP タイムスタンプ理論的には、FTP タイムスタンプは HTTP とほとんど同様に機能しますが、FTP にはヘッダ情報が含まれません。したがって、タイムスタンプはディレクトリ リストから取得しなくてはなりません。 対象となる各ディレクトリ ファイルに対し、Wget は LIST コマンドを使用してリストを取得します。そして、出力結果を Unix の 各ディレクトリ リストが Unix スタイルであると仮定するのは無理が大きいと思われるかもしれませんが、実際にはそんなことはありません。 Unix 互換のリスト形式はほとんどの (すべての?) クライアントが理解できるため、多くの non-Unix FTP サーバーが採用しているのです。断っておきますと、RFC959 には、タイムスタンプはおろか、ファイルリストを取得する標準的な方法は定義されていません。将来の標準化でこの点が定義されることを願うばかりです。 そのほかに、標準的ではありませんが、いくつかの FTP サーバー (有名な wu-ftpd が含まれます) でサポートされている MDTM コマンドを使用する方法が考えられます。このコマンドは、特定のファイルの正確な時間情報を返します。将来的に Wget は、このコマンドをサポートするかもしれません。
|