我试图查找是否可以通过axel
或aria2
或任何其他可用工具下载文件的一部分(任何文件)。
例如,有一个电影文件(因为在 A/V 文件中做这种事情是有意义的)。我如何才能只下载文件第一个部分的最后 50MB 或第三个 60Mb?
文件大部分位于 HTTP 服务器上;但可能位于 FTP 服务器上。如果可以通过其他协议下载它们,这也是一种选择。
答案1
是否可以下载文件的一部分取决于用于传输内容的协议。
如果文件可通过 HTTP/1.1 获得,则任何正确支持 Range 标头(请参阅 RFC 2616 的第 14.35 节)的服务器都应该允许您下载该文件的部分内容。
考虑以下文件:
$ cat testfile.txt
12345
如果我使用 nginx(一个支持 Range 标头的网络服务器)提供此服务,我可以下载其中的部分内容(插入换行符以提高可读性):
$ curl --header "Range: bytes=2-3" https://localhost/testfile.txt -k
34
$ curl --header "Range: bytes=0-1" https://localhost/testfile.txt -k
12
$ curl --header "Range: bytes=4-" https://localhost/testfile.txt -k
5
这与curl、wget 和其他HTTP 客户端用来“恢复”中断的传输的功能相同。
FTP 协议提供通过 RESTART (REST) 命令在给定偏移处恢复文件传输(请参阅 RFC 959 的第 4.1.3 节)。使用与上面相同的 testfile.txt,由 FTP 提供:
$ touch testfile.txt
$ ftp localhost
Connected to localhost.
220 (vsFTPd 2.2.2)
Name (localhost:steve): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> rest 3
restarting at 3. execute get, put or append to initiate transfer
ftp> get testfile.txt
local: testfile.txt remote: testfile.txt
200 PORT command successful. Consider using PASV.
350 Restart position accepted (3).
150 Opening BINARY mode data connection for testfile.txt (6 bytes).
226 Transfer complete.
3 bytes received in 0.00 secs (19.1 kB/s)
ftp> 221 Goodbye.
$ cat testfile.txt
45
我对许多 FTP 客户端不熟悉,所以我不知道是否有这样做,但很可能可以使用 REST 命令读取任何字节子集,然后在获得所需的字节数后停止。
看起来aria2
能够使用该标志恢复 HTTP 和 FTP 传输-c
。这可能使用上述功能,因为它仅支持 HTTP 和 FTP。但是,它本身似乎并不支持仅下载文件的末尾或中间部分。可以--continue
通过在磁盘上创建虚拟文件来利用该标志。如果此文件有 N 个字节,则 aria 可能会从文件的第 N+1 个字节开始。
答案2
curl
有--range
/-r
转变,据记录支持 HTTP 和 FTP(甚至 SFTP)协议:
curl --range start-end ftp://example.com/file.ext --output test.ext
答案3
我发现一个简单的方法就是使用head
:
curl -s https://somedomain.com/file.txt | head -c 1000
这将完成文件的第一个千字节。
在我的用例中,我想解压缩 1GB 的文件内容,所以我这样做:
curl -s https://somedomain.com/file.txt.bz2 | bzcat | head -c 1000 > 1kb-file.txt
爱它!