如何使用 Linux 命令行工具恢复部分下载的文件?
由于断电,我部分下载了一个大文件,即 900 MB 中的 400 MB,但是当我再次开始下载时,它会从头开始恢复。我如何从 400 MB 开始?
答案1
由于您没有指定,我假设您正在使用wget
下载该文件。如果是这种情况,请尝试将其与-c
选项一起使用(例如wget -c <URL>
)。
请注意,如果使用的协议是 ftp(URL 看起来像ftp://...
),则远程服务器有可能使用旧的/古老的 ftp 守护程序,该守护程序不支持恢复下载(无论如何,较新的 ftp 守护程序确实支持它十多年了) ,所以这只是一个很小的机会)。但如果是这种情况,你可能就不走运了。另一方面,如果使用的协议是 http,则应该没有问题。 (更新:根据其他专家(包括下面评论中的 Gilles)的说法,使用 http 时恢复也需要服务器支持,因此这适用于 ftp 和 http)。
祝你好运。
答案2
如果有多个文件需要下载,并且下载在其中一个文件处中断,那么 -c 和 -r 可以提供帮助。
wget -c -r <url>
该命令将检查所有文件并仅下载不完整或未下载的文件。我不得不下载一百多个大文件,并使用以下选项只是为了对服务器友好:
wget -c -r -np -k --wait=15 --limit-rate=50K <url>
答案3
curl -C -
如果你想使用curl
而不是wget
:
curl -C - -o index.html https://example.com
来自man
:
使用“‐C -”告诉curl 自动找出在哪里/如何恢复传输。然后它使用给定的输出/输入文件来解决这个问题。
我们可以通过以下方式快速而肮脏地测试它:
printf asdf > index.html
curl -C - -o index.html https://example.com
现在index.html
开始:
asdfctype html>
<html>
很明显,它在下载时跳过了前 4 个字符,<!do
因为文件已经包含了它们,如果没有这些字符,asdf
文件将是:
<!doctype html>
<html>
服务能力检查:accept-ranges: bytes
增量下载之所以有效,example.com
是因为:
curl -I https://example.com
服务器返回:
accept-ranges: bytes
HTTP header,这意味着curl可以要求ranges:
请求从中间开始:
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Ranges
- https://datatracker.ietf.org/doc/html/rfc7233
在 Ubuntu 23.10、curl 8.2.1 上测试。
答案4
我知道原来的问题是什么意思,答案是不是 wget -c ...
场景可以这样描述:
# Start mirroring a site
wget -m http://...
# 400MB later wget died or interrupted,
# don't know where it left off, don't care,
# just want to get the remaining 100MB without getting the first 400MB again
wget -nc -r -l inf --no-remove-listing http://...
选项“-r -l inf --no-remove-listing”相当于不带-N参数的-m。添加 -nc 参数可避免保存硬盘驱动器中已有的前 400MB。