我可以阻止 wget 创建重复项吗?

我可以阻止 wget 创建重复项吗?

如果我运行 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

另外还有另一个名为-ncwgetting 的选项:

--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.

有时此选项非常好我建议使用-ncoption 而不是 both-c-Noption,因为这些选项将覆写如果下载文件和本地文件同名,则将其合并。

警告(来自 jofel 的评论)

-nc如果服务器上的文件已更改,则此选项不会更新文件。如果您知道文件会更改,则此-N选项是首选。如果您知道文件不会更改(或者您不在乎),那么-nc也可以。

答案4

我知道这是一个关于 wget 的具体问题,但 OP 确实提到了“如果 wget 无法做到这一点,很乐意使用 curl 或类似的可编写脚本的替代方案。”我不确定这里的要求是什么(多个文件,如果与原始版本不同则保留旧版本,用新下载的版本替换)。根据您想要的内容以及您想要如何处理重复项,您可能需要的不仅仅是这些。一个非常简单的方法来做你似乎想要的事情就是改用 curl。

curl http://cdn.sstatic.net/askubuntu/img/logo.png?v=ca4d192163aa > logo.png

此命令每次都会用新下载的文件替换旧文件。

如果您下载的是二进制文件而非文本,请不要将其输出到终端(不带“> [文件名]”)。这样做可能会扰乱您的终端会话。如果您不小心这样做了,您可能需要打开另一个 shell/终端会话。

相关内容