比较文件大小,如果不同则通过 wget 下载

Compare file sizes and download if they're different via wget

我正在通过 wget 下载一些 .mp3 文件(全部合法):

wget -r -nc files.myserver.com

有时我不得不停止下载,那时文件只下载了一部分。例如一个 10 分钟的 record.mp3 文件变成 4 分钟的 record.mp3 文件。播放正确但 不完整.

如果我使用上面的相同命令,因为 record.mp3 文件已经存在于我的本地计算机中,wget 会跳过该文件,尽管它不完整。

我想知道是否有办法检查文件大小以及远程服务器和本地计算机中的文件大小是否不一样重新-下载。 (我知道 --spider 命令给出了文件大小,但是否有任何其他命令可以自动检查文件大小并下载或不下载)。

您可以尝试 -c 选项来继续下载部分下载的文件,但是手册给出了明确的警告:

You need to be especially careful of this when using -c in conjunction with -r, since every file will be considered as an "incomplete download" candidate.

虽然这个问题没有完美的解决方案,但您可以尝试使用 -N 选项来打开时间戳。当文件在服务器上发生更改时,这可能会防止错误,但前提是服务器支持时间戳和部分下载。试一试,看看效果如何。

  wget -r -N -c files.myserver.com

如果您需要检查文件是否部分下载(具有不同的大小)或通过时间戳在远程服务器上更新并且在这种情况下必须在本地更新您需要使用-N选项.

这里有一些关于 -N (--timestamping) 选项的附加信息,来自 Wget 文档:

If the local file does not exist, or the sizes of the files do not match, Wget will download the remote file no matter what the time-stamps say.

添加自:https://www.gnu.org/software/wget/manual/wget.html(章节:5 时间戳

我会使用 wget 的 -N 时间戳选项,但请注意,如果您还指定了 --no-if-modified-since 选项,wget 只会比较文件大小。没有它,不完整的文件确实会在下一个 运行 上被跳过,因为它们收到的是当前时间的时间戳,比服务器上的时间戳新。

原因可能是只有 -N,为设置了 If-Modified-Since 字段的文件发送了 GET 请求。服务器响应 200 或 304,但 304 不包含文件大小,因此 wget 无法检查它。

with --no-if-modified-since wget 发送 HEAD 请求而不是获取时间戳和文件大小,并检查两者。

我递归下载文件夹用的是什么:

wget -T 300 -nv -t 1 -r -nd -np -l 1 -N --no-if-modified-since -P $my_folder $my_url

有:

-T 300: Set the network timeout to 300 seconds
-nv: Turn off verbose without being completely quiet
-t 1: Set number of tries to 1
-r: Turn on recursive retrieving
-nd: Do not create a hierarchy of directories when retrieving recursively
-np: Do not ever ascend to the parent directory when retrieving recursively
-l 1: Specify recursion maximum depth 1
-N: Turn on time-stamping
--no-if-modified-since: Do not send If-Modified-Since header in ‘-N’ mode, send preliminary HEAD request instead