如果 wget 中已经存在文件,则跳过下载?
Posted
技术标签:
【中文标题】如果 wget 中已经存在文件,则跳过下载?【英文标题】:Skip download if files already exist in wget? 【发布时间】:2011-06-24 01:51:52 【问题描述】:这是运行 wget 的最简单示例:
wget http://www.example.com/images/misc/pic.png
但是如果pic.png
已经可用,如何让wget跳过下载?
【问题讨论】:
【参考方案1】:我在使用 -N
时遇到问题,因为我想将输出保存到不同的文件名。
Timestamping, wget docs:
如果满足以下两个条件之一,则文件被视为新文件:
本地不存在同名文件。 确实存在同名文件,但远程文件的修改时间比本地文件晚。
使用test
:
test -f ***.html || wget -O ***.html https://***.com/
如果文件存在不存在,test
将评估为 FALSE,因此将执行 wget
。
【讨论】:
【参考方案2】:-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
;这正是概述的情况。【参考方案3】:
我正在寻找的答案是https://unix.stackexchange.com/a/9557/114862。
当本地文件大于或等于服务器版本时使用
-c
标志将避免重新下载。
【讨论】:
当您下载一堆带有 -i 标志的文件时,这尤其有用。wget -i filelist.txt -c
将恢复失败的文件列表下载。
我正在从既不提供 Length 标头也不提供 Last-modified 标头(在本页其他地方提到)的服务器上下载。因此,如果磁盘上存在同名文件,我想检查 only ,如果存在则跳过重新下载。仍在寻找该解决方案。
-c
表示continue
。如果文件被更改为具有不同内容的更大文件,您将在本地文件末尾开始下载并添加新文件内容。你最终可能会成为垃圾。【参考方案4】:
当使用-r
或-p
运行Wget,但没有-N
、-nd
或-nc
时,重新下载文件将导致新副本简单地覆盖旧副本。
因此添加-nc
将阻止此行为,而是导致保留原始版本并忽略服务器上的任何较新副本。
See more info at GNU.
【讨论】:
【参考方案5】:试试下面的参数:
-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
如果您要同步,以防某些远程文件实际上值得重新下载(编辑:我现在看到另一个答案相同) .以上是关于如果 wget 中已经存在文件,则跳过下载?的主要内容,如果未能解决你的问题,请参考以下文章
判断指定文件中是否包含指定内容,如果没有, 则写入,如果有,则跳过
shell 判断PID是不是存在,存在则kill掉,不存在则跳过