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