[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

5. タイムスタンプ

インターネットからの情報のミラーの側面で最も重要なことの一つは,アーカ イブの更新です.

アーカイブを何度も何度もダウンロードすると,わずかに変更されたファイル の置換だけでは勿体なく,それは,帯域幅とお金の無駄使いの両方を意味し, 更新する時間も無駄になります.これは,全てのミラーツールが逐次的な更新 のオプションを提案する理由です.

そのような更新メカニズムは,リモートサーバが新しい(new)ファイルの 検索でスキャンされることを意味します.これらの新しいファイルのみ古いも のに置換されます.

以下の二つの条件のどちらか一つが当てはまる場合,ファイルは新しいものと 考えられます.

  1. その名前のファイルが,ローカルにまだ存在しない.
  2. その名前のファイルが存在するが,リモートファイルがローカルファイルより 後で編集されている.

これを実装するため,プログラムは,ローカルとリモートの両方のファイルが 最後に更新された時間に気付いている必要があります.そのような情報を,我々 はファイルのタイムスタンプ(time-stamp)と呼びます.

GNU Wgetのタイムスタンプは,‘--timestamping’ (‘-N’)オプション や,‘.wgetrc’でのtimestamping = onの命令を通じて開始されま す.このオプションでそれぞれのファイルをダウンロードするため,Wgetは存 在する同じ名前のローカルファイルを調査します.それが存在しリモートファ イルが古い場合,Wgetはそれをダウンロードしません.

ローカルファイルが存在しない場合やファイルサイズが一致しない場合,Wget はタイムスタンプを気にせずに,リモートファイルをダウンロードします.


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

5.1 タイムスタンプの利用

タイムスタンプの利用は単純です.編集日時を保つため,ダウンロードしたい ファイルに対し以下のようにします.

 
wget -S http://www.gnu.ai.mit.edu/

単純にls -lすると,ローカルファイルのタイムスタンプが,サーバか ら返されるようなLast-Modifiedのステータスと同じになります.タイ ムスタンプ情報は,見て分かるように,たとえ‘-N’がない場合でも(少く ともHTTPに対し)ローカルに維持されます.

数日後,Wgetにリモートファイルが変化したかどうか調査させ,変化した場合 ダウンロードしたい場合もあります.

 
wget -N http://www.gnu.ai.mit.edu/

Wgetはサーバに最後に編集した日付を尋ねます.ローカルファイルがサーバと 同じタイムスタンプ,またはより新しい場合,リモートファイルは再取得され ません.しかし,リモートファイルがより最新の場合,Wgetは取得処理を行い ます.

FTPでも同じようになります.例えば以下のようにします.

 
wget "ftp://ftp.ifi.uio.no/pub/emacs/gnus/*"

(URLの周りの引用符で,シェルが‘*’を展開することを妨げます.)

ダウンロード後にローカルディレクトリをリスト表示すると,リモートサーバ のものと一致するタイムスタンプを表示します.‘-N’でコマンドを再発行 することで,Wgetは,前回ダウンロードしてから編集されたファイルの み再び回収します.

毎週,GNUアーカイブをミラーしたい場合,毎週以下のコマンドを入力するでしょ う.

 
wget --timestamping -r ftp://ftp.gnu.org/pub/gnu/

タイムスタンプは,サーバがタイムスタンプを与えるファイルに対してのみ動 作します.HTTPに対しては,これはLast-Modifiedヘッダに依存し ます.FTPに対しては,これはWgetがパース可能な書式の,日付を用いた ディレクトリリストで得られるものに依存します(see section FTPタイムスタンプの内部).


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

5.2 HTTPタイムスタンプの内部

HTTPのタイムスタンプは,Last-Modifiedヘッダの調査により実行 されます.HTTPでファイル‘foo.html’を回収したい場合,Wgetは ‘foo.html’がローカルに存在しているかどうかを調べます.存在しない場 合,‘foo.html’は無条件に回収されます.

ローカルにファイルがある場合,Wgetは最初にローカルのタイムスタンプを調 べ(ls -lでそれを調べることに似ています),そして,リモートファイ ルの情報を要求するため,HEAD要求をリモートサーバに送ります.

Last-Modifiedヘッダは,ファイルがより最近編集され(“新しく”され) たことを知るために調査されます.リモートファイルがより新しい場合,ダウ ンロードされます.古い場合,Wgetは諦めます.(2)

-N’とともに‘--backup-converted’ (‘-K’)が指定されている とき,サーバファイル‘X’は,それが現存している場合はローカル ファイルの‘X.orig’と比較され,ローカルファイル ‘X’と比較されません—‘--convert-links’ (‘-k’)で変 換されている場合は常に異なっています.

おそらく,HTTPタイムスタンプはIf-Modified-Since要求を使用し て実装されるべきです.


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

5.3 FTPタイムスタンプの内部

理論上,FTPタイムスタンプはHTTPと同じように動作しますが, FTPにはヘッダがありません—タイムスタンプはディレクトリリストから 探し出す必要があります.

FTPダウンロードが,再帰的またはglobを使用している場合,ディレクト リが含んでいる要求されたファイルに対してファイルリストを取得するために, WgetはFTP LISTコマンドを使用します.それはリストの解析を試 み,それをUnixのls -lの出力のように扱い,タイムスタンプを抽出し ます.残りはHTTPに対するものと全く同じです.FTPサーバから globや再帰を使用しないで個別のファイルを回収する時,‘-N’を指定しな い限りリストアップされたファイルはダウンロードされません(そして,このた めファイルにタイムスタンプは付きません).

全てのディレクトリリストがUnix形式のリストだという仮定は,非常に不自然 に感じるかもしれませんが,経験的にはそうではなく,その理由は,ほとんど (全て?)のクライアントがそれを理解できるので,多くの非Unix FTPサー バでもUnixのようなリスト書式を使用しているためです.RFC959定義が, タイムスタンプは言うまでもなく,ファイルリストを取得する標準的な方法で はないことを覚えておいてください.我々は,将来の標準がこのように定義さ れることを期待することしかできません.

もう一つの非標準の解決方法は,(評判のよいwu-ftpdを含め)いくつか のFTPサーバがサポートするMDTMコマンドの使用も含まれていて, それは指定したファイルの正確な時間を返します.Wgetは,将来このコマンド をサポートするかもしれません.


[ << ] [ >> ]           [冒頭] [目次] [見出し] [ ? ]

この文書は新堂 安孝によって2009年9月22日texi2html 1.82を用いて生成されました。