[Wget - насос для Интернета]
Wget 1.5.3. Руководство пользователя
VAP home logo

Контроль времени модификации

Одним из наиболее важных аспектов зеркалирования информации из Интернета является обновление ваших архивов.

Периодическая полная выгрузка архива только из-за нескольких в нем изменений - неблагодарная операция, она пожирает пропускную способность канала, деньги и время требуемое на обновление. Вот почему утилиты зеркалирования предоставляют возможность наращиваемого обновления.

Подобный механизм обновления означает, что удаленный сервер проверяется на предмет появления на нем новых файлов. Только эти файлы будут выгружены в замен устаревших их локальных копий или в дополнение к существующим.

Файл рассматривается как новый если выполняется одно из следующих условий:

  1. Файл с таким именем отсутствует в локальной системе.
  2. Файл с таким именем уже существует, но время модификации у удаленного файла более позднее, чем у локального.

Для реализации этого программе требуется информация о времени модификации локального и удаленного файлов. Подобная информация называется временными штампами.

Временные штампы включаются в Wget опцией "--timestamping" ("-N") или посредством директивы "timestamping = on" в файле ".wgetrc". При этой опции для каждого файла предполагаемого к выгрузке Wget проверяет наличие локального файла с таким же именем. Если такой файл существует и время его модификации более раннее чем у удаленного файла, то Wget его выгружает.

Если локальный файл не существует или размеры локального и удаленного файла не совпадают, то Wget выполнит выгрузку удаленного файла не зависимо от того, что говорят временные штампы.


Использование временных штампов

Применение временных штампов простое. Скажем, вы хотите выгрузить файл таким образом, чтобы сохранить его дату модификации.

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

Простой вызов "ls -l" покажет, что временной штамп локального файла эквивалентен значению заголовка "Last-Modified", возвращаемого сервером. Отсюда вы видите, что временные штампы сохраняются локально даже без опции "-N"

Если несколько дней спустя вы захотите, чтобы Wget проверил удаленный файл на изменение и выгрузил его, если он изменился.

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

Wget запросит у сервера дату модификации файла. Если локальный файл не старее, то удаленный файл не будет выгружен. Однако, если удаленный файл более новый, то он будет выгружен обычным образом.

То же самое относится к FTP. Например:

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

"ls" покажет, что временные штампы установлены в соответствии с их состоянием на удаленном сервере. Перезапуск команды с опцией "-N" принудит Wget дополучить только те файлы, что были изменены.

При HTTP и FTP выгрузке Wget будет корректно устанавливать локальные временные штампы независимо от использования "-N" если, конечно, он сможет получить список для FTP каталога или заголовок "Last-Modified" для HTTP.

Если вы желаете зеркалировать GNU архив каждую неделю, то вам необходимо пользоваться следующей командой:

wget --timestamping -r ftp://prep.ai.mit.edu/pub/gnu/

Временные штампы HTML изнутри

Временные штампы для HTTP реализованы через использование заголовка "Last-Modified". Если вы желаете получить файл "foo.html" посредством HTTP, то Wget проверит существует ли локально файл "foo.html". Если такой файл отсутствует, то Wget выгрузит его безусловно.

Если файл существует локально, Wget сперва проверит локальный временной штамп (аналогично способу проверки через "ls -l"), а затем пошлет серверу запрос "HEAD" в расчете на получение информации об удаленном файле.

В полученном от сервера ответе будет проверен заголовок "Last-Modified" на предмет выяснения наиболее поздней модификации, т.е. какой из файлов новее. Если таковым является удаленный файл, то он будет выгружен, в противном случае Wget завершит операцию1.

Возможно, временные шаблоны HTTP должны быть реализованы с применением запроса "If-Modified-Since".


Временные штампы FTP изнутри

Теоретически временные штампы FTP работают так же как и HTTP, однако FTP не использует заголовки, отсюда информация о временных штампах может быть получена из списков каталогов.

Для каждого каталога, из которого будут выгружаться файлы, Wget выполняет команду "LIST" для получения списка файлов в каталоге. После этого он пытается проанализировать полученный список, предполагая, что он имеет формат UNIX команды "ls -l", с целью извлечения из него временных штампов. Остальное полностью подобно HTTP.

Предположение, что каждый список каталога соответствует по своему формату UNIX стилю, возможно, звучит настораживающе, однако на практике это не так, поскольку большинство не-UNIX FTP серверов используют "юниксоидный" формат списков потому, что большинство (все?) FTP клиентов их понимают. Принимая во внимание то, что RFC959 не определяет стандартного способа получения списка файлов, оставим все на временные шаблоны. Мы можем только надеяться, что будущие стандарты все же будут иметь такое определение.

Другим нестандартным решением является использование команды "MDTM", которая поддерживается некоторыми FTP серверами, включая популярный "wu-ftpd". Эта команда возвращает время модификации указанного файла. Возможно Wget будет поддерживать эту команду в будущем.


  1. В качестве дополнительной проверки Wget будет просматривать поле заголовка "Content-length" и сравнивать размеры. Если они не совпадут, то удаленный файл будет выгружен обычным порядком не зависимо от того, что говорят временные штампы.




ФОБОС: погода в г.Тольятти