这是运行 wget 的最简单示例:
wget http://www.example.com/images/misc/pic.png
但是如果pic.png
已经可用,如何让 wget 跳过下载?
试试下面的参数:
-nc, --no-clobber:跳过将下载到现有文件的下载。
示例用法:
wget -nc http://example.com/pic.png
-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
是更好的解决方案。
wget
将抱怨 Last-modified header missing
;这正是概述的情况。
我正在寻找的答案在 https://unix.stackexchange.com/a/9557/114862。
当本地文件大于或等于服务器版本时使用 -c 标志将避免重新下载。
wget -i filelist.txt -c
将恢复失败的文件列表下载。
-c
表示 continue
。如果文件被更改为具有不同内容的更大文件,您将在本地文件末尾开始下载并添加新文件内容。你最终可能会变成垃圾。
当使用 -r
或 -p
但没有 -N
、-nd
或 -nc
运行 Wget 时,重新下载文件将导致新副本简单地覆盖旧副本。
因此,添加 -nc
将阻止此行为,而是导致保留原始版本并忽略服务器上的任何较新副本。
-nc, --no-clobber
如果在同一目录中多次下载文件,wget 的行为取决于几个选项,包括 -nc
。在某些情况下,本地文件在重复下载时会被“破坏”(覆盖)。在其他情况下,它会被保留。
在没有 -N
、-nc
或 -r
的情况下运行 wget 时,将同一文件下载到同一目录中会导致文件的原始副本被保留,而第二个副本被命名为 file.1。如果再次下载该文件,则第三个副本命名为 file.2,依此类推。指定 -nc
时,此行为被禁止,并且 wget 拒绝下载文件的较新副本。因此,“no-clobbe
r”在这种模式下是用词不当:它不是阻止破坏(因为数字后缀已经阻止了破坏),而是关闭了多版本保存。
当使用 -r
但没有 -N
或 -nc
运行 wget 时,重新下载文件会导致新副本覆盖旧副本。添加 -nc
可防止此行为,而是导致保留原始版本并忽略服务器上的任何较新副本。
在使用 -N
运行 wget 时,无论是否使用 -r
,是否下载文件的较新副本的决定取决于本地和远程时间戳以及文件的大小。 -nc
不能与 -N
同时指定。
请注意,当指定 -nc
时,后缀为 .html 或 .htm 的文件将从本地磁盘加载并解析,就好像它们是从 Web 检索到的一样。
我在使用 -N
时遇到问题,因为我想将输出保存到不同的文件名。
如果满足以下两个条件之一,则认为文件是新文件: 该名称的文件在本地不存在。该名称的文件确实存在,但远程文件的修改时间比本地文件的更新时间要晚。
使用 test
:
test -f stackoverflow.html || wget -O stackoverflow.html https://stackoverflow.com/
如果文件存在不存在,则 test
将评估为 FALSE,因此将执行 wget
。
[ ! -e "$(basename $URL)" ] && wget $URL
--recursive
选项。wget -nc -i list.txt
对 3,000 个 URL 列表进行了测试。不要以为服务器可以在十分之一秒内抓取 3k 个链接!-N, --timestamping
会说don't re-retrieve files unless newer than local
,以防某些远程文件实际上值得重新下载(编辑:我现在看到另一个答案相同)。