在Bash脚本中通过HTTP获取远程文件的修改时间


13

我正在创建一个简单的Bash脚本,以通过HTTP提取远程文件的文件修改时间/日期。

示例文件: http://example.com/bar/example.pdf

可以下载实际文件就完成吗?如果没有,什么是最好的选择?

Answers:


13

老实说,不是直接的。

您将必须从远程站点获取数据以获取有关文件的信息。通常,这是通过HEAD请求完成的,但是某些(大多数?)服务器没有正确实现该GET请求并无法传递整个文件,就像执行请求一样。假设您已curl安装:

curl -s -v -X HEAD http://foo.com/bar/baz.pdf 2>&1 | grep '^< Last-Modified:'

可能会为您提供所需的内容,但是如上所述,它在很大程度上取决于服务器。


6
“最”?如果任何流行的HTTP服务器都以这种方式违反了协议,我会感到惊讶。
user1686

当然应该改变了。前一段时间,当我处理此类问题时,就是这样。但是,时间流逝。如果您发现无论什么“应用程序”仍在运行cgi的站点,则它们很可能无法处理HEAD。但是,这些站点也可以为您带来结果,因为它们应该可以提供所有内容。
Karsten S.

3
我建议使用该--head选项,而不是-X HEAD使其更简洁,这样命令将变为: curl -s -v --head http://foo.com/bar/baz.pdf 2>&1 | grep '^< Last-Modified:'
Gautham C.

1
curl -svX HEAD更简洁...
Karsten S.

1
@ Hi-Angel不,通常没有。Wget使用If-Modified-Since标头说“嘿,如果该文件比该日期新,则仅发送该文件”,然后由服务器来实现并遵守该标头。如果服务器认为文件未更改,则会发送304 NOT MODIFIED响应。
antonagestam

12

服务器响应通常确实具有Last-Modified字段,您可以在不下载文件的情况下进行检查。没有必要使用-X HEAD,有一个特殊的选项-I(在-s禁止显示进度输出)

curl -sI http://example.com/bar/example.pdf | grep -i Last-Modified

另外,在我的情况下,没有卷曲安装(我做了一个嵌入式设备的脚本),只是wget。wget的方式是:

wget --server-response --spider http://example.com/bar/example.pdf 2>&1 | grep -i Last-Modified

--server-response打印头和--spider选项强制不下载网页,而是检查自己的存在。


2
curl是一个比公认的更好的答案。也许grep -i因为“最后修改的”经常使用,所以情况有所不同。
not2qubit

注释的@ not2qubit thx,已编辑。
Hi-Angel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.