使用Wget跳过已成功下载的文件

4

我有一个使用wget下载文件的Bash子程序,现在的问题是如何跳过已成功下载的文件。该脚本会下载大量文件,一旦下载失败,它会重新从头开始下载所有文件,覆盖那些已经成功下载的文件(因为重新下载可能不完整)。

那么,我该如何跳过已成功下载的文件呢?

DownloadFile() {
  paramURL=$1
  paramFilename=$2

  if [ $flag_archive_fetch = "false"  ];
  then
      wget "--timeout=180" "--tries=5" "$paramURL" "-O" "${scratch_dir}$paramFilename"
  else
      unzip -o "$archive_file" "$paramFilename" -d "${scratch_dir}"
  fi

  touch "${scratch_dir}$paramFilename"
}
2个回答

7
你可以利用 Wget 的 --continue (恢复断点下载)和 --timestamping(仅在上次修改时间发生变化时覆盖已下载的文件,否则跳过下载) 来实现更好的下载体验。
wget "--continue ‐‐timestamping --timeout=180" "--tries=5" "$paramURL" "-O" "${scratch_dir}$paramFilename"

另一个选项是使用--no-clobber而不是--timestamping,它跳过已经下载的文件而不检查Last-modified属性。

 wget "--continue ‐‐no-clobber --timeout=180" "--tries=5" "$paramURL" "-O" "${scratch_dir}$paramFilename"

谢谢你的回答,那么 "--continue" 会跳过已经存在的文件吗?我原以为它只是针对未完成的下载。 - Woootiness
--continue用于继续未完成的下载,--timestamping用于跳过已经下载的文件。 - davcs86
尝试使用--continue和--no-clobber,但是no clobber的问题在于您无法继续未完成的下载。 - Woootiness
"--no-clobber" 应该检查文件是否存在,不必联系服务器,那么它如何知道文件是否不完整?"--continue" 需要检查本地文件和服务器上的大小,因此需要发出请求以确定服务器上的大小才能继续下载。这些选项因此存在冲突。 Woootiness 需要记录成功和失败的下载,以便可以 --no-clobber 成功下载的文件(或完全跳过它们),或者如果必要的话,则使用 --continue 。 - Terje Oseberg

1
你可以通过检查$?来检查WGET退出状态码。请保留HTML标签。
wget .....
# store the error
error=$?
if (( $error != 0 )) 
then
   #handle error
else
   #handle success
fi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接