我怎样才能通过 wget 获取文件是否已经改变?

我怎样才能通过 wget 获取文件是否已经改变?

我有一个 cronjob,用于从远程服务器下载 PDF 文件。文件名始终是静态的,但我将其保存到带有日期的目录中。文件会按服务器的原始保存时间保存,但开关-N似乎不起作用。

我收到有关无法使用时间戳的错误-O

我是不是漏掉了什么?我读了手册页,但还是搞不清楚。

wget -N -O ~/foo/foo_`date +%Y%m%d`.pdf http://foo.com/blarg/daily_newsletter.pdf

正是我正在尝试做的。

答案1

手册页解释得很好:

这些文档不会写入相应的文件,但会全部连接在一起并写入文件。如果使用“-”作为文件,文档将打印到标准输出,从而禁用链接转换。(使用“./-”打印到名为“-”的文件。)

使用“-O”并不意味着简单地“使用名称文件而不是 URL 中的文件”,而是类似于 shell 重定向:'wget -O filehttp://foo' 旨在像 'wget -O -http://foo> 文件';文件将立即被截断,并且所有下载的内容都将写入那里。

因此,不支持将“-N”(用于检查时间戳)与“-O”结合使用:由于文件始终是新创建的,因此它将始终具有非常新的时间戳。如果使用此组合,则会发出警告。

因此,正如它所说,-O不是重命名输出文件,而是将所有下载文件的所有标准输出重定向到file。您可能必须下载文件并重命名它以保留时间戳。

答案2

就我而言,我需要从包含动态查询字符串的 URL 下载文件,例如https://domain/file.ext?AWSAccessKeyId=Abc123&Expires=123456&Signature=Xyz789。服务器不支持HEAD请求并且不写入Content-Disposition标头,因此我无法尝试将--content-disposition重命名文件选项与--timestamping选项一起使用。

我找不到仅在使用wgetcurl单独更改时下载此类文件的方法。但是,我注意到响应包含标Last-modified头,因此我设法编写了一个 bash 脚本来执行此操作:

FILE=file.ext
TS_FILE=.$FILE.last_updated
url=$(command_to_get_url)

# create a temp file with server timestamp
last_modified=$(curl -sD - "$url" | head -n 10 | grep -am1 '^Last-Modified' | cut -d' ' -f2-)
touch -d "$last_modified" "$TS_FILE"

# skip if local file is newer
if [[ -f "$FILE" && ! "$TS_FILE" -ot "$FILE" ]]; then
    echo "Skipping download as existing $FILE is newer than that on server."
    exit 1
fi

# download and set timestamp
wget -O "$FILE" "$url"
touch -r "$TS_FILE" "$FILE"
rm "$TS_FILE"

相关内容