使用perl(或wget)仅下载新的/修改过的文件

时间:2010-08-04 20:07:43

标签: perl http shell

我有一个Perl脚本,可以从远程服务器下载大量文件。我想避免锤击服务器,所以我想避免下载文件,如果它自我上次检查后没有被修改过。有没有一种很好的方法可以在Perl或shell脚本中执行此操作?

我是否可以让服务器为未修改的文件发送HTTP 304而不是HTTP 200

2 个答案:

答案 0 :(得分:5)

是的,请使用LWP::UserAgent并特别注意mirror方法。这也可以在程序LWP::Simple中作为mirror函数使用。

来自LWP的POD:

  

此方法将获取$ url标识的文档,并将其存储在名为$ filename的文件中。如果该文件已存在,则该请求将包含与文件的修改时间匹配的“If-Modified-Since”标头。如果此时服务器上的文档没有更改,则没有任何反应。如果文档已更新,将再次下载。将强制文件的修改时间与服务器的修改时间匹配。

     

返回值是响应对象。

HTTP 304是服务器在您通过If-Modified-Since测试并且您的副本是新的时将返回的响应代码。 LWP在mirror内部执行此操作 - 您无需担心。

答案 1 :(得分:1)

这是基于Evan Carrol的回答,但我将详细说明这对其他人有用。我把响应部分删掉了;我怀疑我的部分代码会很有趣。

#!/usr/bin/perl -w

require HTTP::Date;
require LWP::UserAgent;
require Date::Parse;

my $lastChecked = '2009-01-01';
my $ua = LWP::UserAgent->new;
$ua->default_header('If-Modified-Since' => HTTP::Date::time2str(Date::Parse::str2time($lastChecked)));

my $response = $ua->get('http://example.com/');

if ($response->code == 304) {
    print "No changes.\n";
} elsif ($response->is_success) {
    print $response->decoded_content;
} else {
    print "Response was error " . $response->code . ": '" . $response->status_line . "'\n";
}