使用wget镜像远程目录成功后执行增量更新时报“Cannot write to”错误
使用wget镜像远程目录成功后执行增量更新时报“Cannot write to”错误
我之前也碰到过一模一样的问题,其实这个错误的根源在于wget对URL末尾斜杠的处理逻辑,结合你遇到的情况,咱们来拆解并解决它:
问题根源分析
你第一次执行wget -m -e robots=off https://example.com/folders时,服务器返回了301重定向到带斜杠的https://example.com/folders/,wget会自动创建本地的example.com/folders目录,并把目录索引页和里面的文件都下载进去。
但第二次执行带--timestamp的命令时,你还是用了不带斜杠的URL:
wget -m -e robots=off --timestamp https://example.com/folders
wget再次请求这个不带斜杠的URL,又触发了301重定向到带斜杠的版本。这时候wget会把重定向返回的目录索引HTML页面,尝试写入本地已经存在的example.com/folders目录里——但目录不能被当作文件写入,所以就抛出了Cannot write to ‘example.com/folders’ (Success)的错误。
解决方案:给URL加上末尾的斜杠
把命令改成带斜杠的版本,让wget一开始就明确知道这是一个目录:
wget -m -e robots=off --timestamp https://example.com/folders/
这样wget会直接请求目录的索引页,识别本地已有的example.com/folders目录,然后对比远程和本地文件的时间戳,只下载新增或更新的文件,完美实现增量更新的需求。
额外小提示
- 如果你担心误覆盖文件,可以额外加上
--no-clobber参数,它会确保wget不会覆盖本地已存在的文件(不过-m镜像模式已经包含了类似的安全逻辑,加不加看个人习惯)。 - 虽然你说本地目录权限没问题,但可以再确认下当前用户对
example.com/folders目录有读写权限,避免其他潜在的权限问题。
备注:内容来源于stack exchange,提问作者KevinHJ
相关产品推荐
相关产品推荐

