ChatGPT解决这个技术问题 Extra ChatGPT

如果 wget 中已经存在文件,则跳过下载?

这是运行 wget 的最简单示例:

wget http://www.example.com/images/misc/pic.png

但是如果pic.png已经可用,如何让 wget 跳过下载?


k
kenorb

试试下面的参数:

-nc, --no-clobber:跳过将下载到现有文件的下载。

示例用法:

wget -nc http://example.com/pic.png

如链接问题所述,我不同意 - 如果使用 no-clobber 并且文件名存在,则它会退出。甚至没有 HEAD 请求。即使不是这种情况,请检查您是否有文件开头 :-) [ ! -e "$(basename $URL)" ] && wget $URL
我想我可能会得到不同的结果,因为我使用的是 --recursive 选项。
很好的答案!不同意ma11hew28。我刚刚使用 GNU Wget 1.14 和 wget -nc -i list.txt 对 3,000 个 URL 列表进行了测试。不要以为服务器可以在十分之一秒内抓取 3k 个链接!
此外,如果您要同步,-N, --timestamping 会说 don't re-retrieve files unless newer than local,以防某些远程文件实际上值得重新下载(编辑:我现在看到另一个答案相同)。
s
sdgfsdh

-nc--no-clobber 选项不是最佳解决方案,因为不会下载较新的文件。应该使用 -N 代替,只有当服务器具有较新版本时才会下载并覆盖文件,因此正确答案是:

wget -N http://www.example.com/images/misc/pic.png

然后使用 -N 运行 Wget,使用或不使用 -r 或 -p,是否下载文件的较新副本取决于本地和远程时间戳以及文件大小。 -nc 不能与 -N 同时指定。 -N, --timestamping:开启时间戳。


当服务器配置不正确时,-N 可能会失败,并且 wget 将始终重新下载。所以有时 -nc 是更好的解决方案。
发生“当服务器配置不正确时”的适用场景是什么?
当您从复制的位置下载时,会更改所有时间戳。
这是否最好取决于上下文。例如,我正在从列表中下载 ~1600 个文件,然后更新列表以包含更多文件。这些文件不会改变,所以我不关心最新版本,我不希望它检查服务器是否有我已经拥有的 1600 个文件的新版本。
@AjayKumarBasuthkar:当服务器不支持任何检查新文件的方式时,wget 将抱怨 Last-modified header missing;这正是概述的情况。
j
jsta

我正在寻找的答案在 https://unix.stackexchange.com/a/9557/114862

当本地文件大于或等于服务器版本时使用 -c 标志将避免重新下载。


当您使用 -i 标志下载一堆文件时,这尤其有用。 wget -i filelist.txt -c 将恢复失败的文件列表下载。
我正在从既不提供 Length 标头也不提供 Last-modified 标头(本页其他地方提到)的服务器下载。因此,我只想检查磁盘上是否存在同名文件,如果存在则跳过重新下载。仍在寻找该解决方案。
-c 表示 continue。如果文件被更改为具有不同内容的更大文件,您将在本地文件末尾开始下载并添加新文件内容。你最终可能会变成垃圾。
k
kenorb

当使用 -r-p 但没有 -N-nd-nc 运行 Wget 时,重新下载文件将导致新副本简单地覆盖旧副本。

因此,添加 -nc 将阻止此行为,而是导致保留原始版本并忽略服务器上的任何较新副本。

See more info at GNU.


E
Engr Ali
-nc, --no-clobber

如果在同一目录中多次下载文件,wget 的行为取决于几个选项,包括 -nc。在某些情况下,本地文件在重复下载时会被“破坏”(覆盖)。在其他情况下,它会被保留。

在没有 -N-nc-r 的情况下运行 wget 时,将同一文件下载到同一目录中会导致文件的原始副本被保留,而第二个副本被命名为 file.1。如果再次下载该文件,则第三个副本命名为 file.2,依此类推。指定 -nc 时,此行为被禁止,并且 wget 拒绝下载文件的较新副本。因此,“no-clobber”在这种模式下是用词不当:它不是阻止破坏(因为数字后缀已经阻止了破坏),而是关闭了多版本保存。

当使用 -r 但没有 -N-nc 运行 wget 时,重新下载文件会导致新副本覆盖旧副本。添加 -nc 可防止此行为,而是导致保留原始版本并忽略服务器上的任何较新副本。

在使用 -N 运行 wget 时,无论是否使用 -r,是否下载文件的较新副本的决定取决于本地和远程时间戳以及文件的大小。 -nc 不能与 -N 同时指定。

请注意,当指定 -nc 时,后缀为 .html 或 .htm 的文件将从本地磁盘加载并解析,就好像它们是从 Web 检索到的一样。


r
rdmolony

我在使用 -N 时遇到问题,因为我想将输出保存到不同的文件名。

Timestamping, wget docs

如果满足以下两个条件之一,则认为文件是新文件: 该名称的文件在本地不存在。该名称的文件确实存在,但远程文件的修改时间比本地文件的更新时间要晚。

使用 test

test -f stackoverflow.html || wget -O stackoverflow.html https://stackoverflow.com/

如果文件存在不存在,则 test 将评估为 FALSE,因此将执行 wget