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


13

如果我运行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,可以使用curl或类似的脚本替代方法。)


9
好吧,它创建了一个新文件,因为它可以识别文件在那里!
nico 2015年

Answers:


17

我建议您使用该-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.

警告(来自KasiyA的评论)

如果服务器配置不正确,它可能总是报告该文件是新文件,-N并总是重新下载该文件。在这种情况下,-nc可能是一个更好的选择。


3
如果未正确配置服务器,则-N可能会失败,并且wget将始终重新下载。所以有时-nc优于-N
αғsнιη

1
@Kasiy感谢您的评论,在所有情况下似乎都没有好的选择。
jofel

16

是的,它是-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服务器来对其进行测试(感谢@roadmranswer):

打开终端窗口,然后键入:

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 ...。太好了,现在您将看到文件再次重新下载,但是您之前已经下载过。

原因:为什么要重新下载?

因为它的大小更改为大于旧下载文件的大小,仅此而已。


1
如果两次下载之间服务器上的文件已更改,则此操作将无法正常进行。在最坏的情况下(文件大小增加了),您会得到损坏的文件。
jofel

1
@jofel是的-nc,与您所说的不一样,但是-c选项可以使用,这就是为什么我-c首先提到选项的原因。
αғsнιη

使用-cwget向服务器询问已下载文件部分之外的任何数据,仅此而已。同时,它不会检查服务器上文件的已下载部分是否有任何更改。在最坏的情况下,您会得到损坏的文件,该文件是新旧文件的混合体。
jofel

在查看了选项之后,我认为这仅对日志文件(保证增量更新)有用,在所有其他情况下,我认为-N或-nc更适合处理整个文件
david.libremone 2015年

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.

有时,此选项非常好,我建议使用-ncoption而不是两者-c-Noption,因为如果它们具有相同的名称,则这些选项将用本地文件覆盖下载文件。

警告(来自jofel的评论)

-nc如果服务器上的文件已更改,则该选项不会更新文件。如果您知道文件将更改,-N则最好使用该选项。如果您知道文件不会更改(或您不在乎),则-nc可以。


1

我知道这是一个与wget有关的特定问题,但OP确实提到“如果wget无法做到,很高兴使用curl或类似的脚本替代方法”。我不确定这里的要求是什么(多个文件,如果与原始版本不同,则保留旧版本,然后替换为新下载的版本)。根据您想要的以及如何处理重复项,您可能需要的还不止于此。.一种非常简单的方法来执行您想要的操作,而只是使用curl。

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

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

如果要下载二进制文件而不是文本文件,请不要将其输出到终端(没有“> [filename]”)。这样做可能会干扰您的终端会话。万一您意外地这样做,可能需要打开另一个外壳程序/终端会话。


如果由于显示了二进制文件而导致终端状态不佳,则调用程序“重置”可能比打开新终端要容易。
jofel

您是对的,我不清楚我的要求,但令人高兴的结果是我了解了更多选择:)谢谢
david.libremone 2015年

谢谢@jofel ^^不知道“重置”,我总是只关闭了打开一个新标签页并在发生这种情况时关闭了一个乱码...尽管我并不是真的经常发生。
Goblinlord 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.