如果我运行 wget 两次,它不会识别出它已经下载了该文件,并会创建一个新文件。有什么方法可以防止它再次下载该文件?
$ wget https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...
$ wget https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png.1’
...
(如果 wget 无法做到这一点,那么很乐意使用 curl 或类似的可编写脚本的替代方案。)
答案1
我建议您使用该-N
选项。
-N
--timestamping
Turn on time-stamping.
它启用时间戳,仅当服务器上的文件比下载的版本更新时才重新下载文件。
$ wget -N https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...
$ wget -N https://cdn.sstatic.net/askubuntu/img/logo.png
...
Server file no newer than local file ‘logo.png’ -- not retrieving.
警告(来自 αғsнιη 的评论)
如果服务器配置不正确,它可能会一直报告文件是新的,并-N
会一直重新下载文件。在这种情况下,-nc
这可能是一个更好的选择。
答案2
是的,这是-c
选择。
--continue
Continue getting a partially-downloaded file. This is useful when you want to
finish up a download started by a previous instance of Wget, or by another
program.
如果文件相同,第二次下载尝试将停止。
$ wget -c https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...
$ wget -c https://cdn.sstatic.net/askubuntu/img/logo.png
...
The file is already fully retrieved; nothing to do.
注意事项(来自 jofel 的评论)
如果服务器上的文件已发生更改,该-c
选项可能会产生不正确的结果。
使用 时-c
,wget 只会向服务器请求已下载文件部分以外的任何数据,而不会请求其他任何数据。它不会检查已下载文件部分是否有任何更改。因此,您可能会得到一个混合了新旧文件的损坏文件。
本地测试
您可以通过运行简单的本地 Web 服务器来测试它,如下所示(感谢@roadmr的回答):
打开终端窗口并输入:
cd /path/to/parent-download-dir/
python -m SimpleHTTPServer
现在打开另一个终端并执行:
wget -c http://localhost:8000/filename-to-download
请注意,这是我们想要下载的filename-to-download
文件所在的位置。/path/to/parent-download-dir/
现在,如果您多次运行 wget 命令,您将看到:
The file is already fully retrieved; nothing to do.
好的,现在转到/path/to/parent-download-dir/
目录并向源文件添加一些内容,例如,如果它是一个文本文件,则在其中添加一个简单的额外行并保存文件。现在尝试使用wget -c ...
。太好了,现在您将看到文件再次重新下载,但您之前已经下载过它。
原因:为什么要重新下载?
因为它的大小变得比旧下载的文件更大,仅此而已。
答案3
另外还有另一个名为-nc
wgetting 的选项:
--no-clobber
If a file is downloaded more than once in the same directory, Wget's behavior
depends on a few options, including -nc. In certain cases, the local file will
be clobbered, or overwritten, upon repeated download. In other cases it will be
preserved.
当-nc
指定选项时,Wget 将拒绝下载同一文件的副本。如果您wget
尝试下载相同的文件,除非您重命名或删除本地文件,否则它将拒绝下载。
$ wget -nc https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...
$ wget -nc https://cdn.sstatic.net/askubuntu/img/logo.png
File ‘logo.png’ already there; not retrieving.
有时此选项非常好我建议使用-nc
option 而不是 both-c
或-N
option,因为这些选项将覆写如果下载文件和本地文件同名,则将其合并。
警告(来自 jofel 的评论)
-nc
如果服务器上的文件已更改,则此选项不会更新文件。如果您知道文件会更改,则此-N
选项是首选。如果您知道文件不会更改(或者您不在乎),那么-nc
也可以。
答案4
我知道这是一个关于 wget 的具体问题,但 OP 确实提到了“如果 wget 无法做到这一点,很乐意使用 curl 或类似的可编写脚本的替代方案。”我不确定这里的要求是什么(多个文件,如果与原始版本不同则保留旧版本,用新下载的版本替换)。根据您想要的内容以及您想要如何处理重复项,您可能需要的不仅仅是这些。一个非常简单的方法来做你似乎想要的事情就是改用 curl。
curl http://cdn.sstatic.net/askubuntu/img/logo.png?v=ca4d192163aa > logo.png
此命令每次都会用新下载的文件替换旧文件。
如果您下载的是二进制文件而非文本,请不要将其输出到终端(不带“> [文件名]”)。这样做可能会扰乱您的终端会话。如果您不小心这样做了,您可能需要打开另一个 shell/终端会话。