![仅使用 URL 从在线 tar 存档中提取文件](https://linux22.com/image/1551121/%E4%BB%85%E4%BD%BF%E7%94%A8%20URL%20%E4%BB%8E%E5%9C%A8%E7%BA%BF%20tar%20%E5%AD%98%E6%A1%A3%E4%B8%AD%E6%8F%90%E5%8F%96%E6%96%87%E4%BB%B6.png)
我在网上找到了一个大小超过 50GB 的 tar 文件。我只需要从该 tar 文件中提取一些小内容(100MB)。我发现,为了 100MB 而下载整个 50GB 的文件会浪费我的时间和带宽。
所以我的问题是,有没有什么方法可以用来对在线 tar 文件执行操作(仅具有 URL),而无需下载整个 tar 存档。
答案1
我假设协议是 HTTP。在我的 Kubuntu 中,正确的工具是httpfs2
。
httpfs2
是基于 FUSE 的文件系统,用于将 http 或 https URL 作为文件挂载到文件系统中。http 中没有可列出目录的概念,因此只能挂载单个 URL。服务器必须能够发送字节范围。
如果相关 tar 文件的 URL 是http://ser.ver/bar.tar
,请按以下步骤操作:
mkdir foo
httpfs2 -f http://ser.ver/bar.tar ./foo
我使用-f
(保持在前台)有两个原因:
- 如果出现问题,进程就会退出,我可以立即看到。
- 该过程打印到控制台,因此无论如何切换到另一个控制台都很方便。
现在您的文件系统中应该有./foo/bar.tar
可用的文件。该文件是可查找的且是只读的。提取您需要的内容,然后卸载(选择一个):
fusermount -u ./foo
;- Ctrl+在运行C的控制台中
httpfs2
; killall httpfs2
。
我已经通过安装以下 ISO 文件测试了该解决方案:
http://cdimage.ubuntu.com/cdimage/kubuntu/releases/17.10/release/kubuntu-17.10.1-desktop-amd64.iso
并使用 进行浏览ark
。
第二次测试是使用我局域网中 Debian 服务器托管的 30+ GB tar 存档。存档是专门为这次测试创建的,我注意到哪些文件是在开头附近添加的,哪些文件是在结尾附近添加的。然后在 Kubuntu 客户端上,我mc
进入httpfs2
已挂载的存档并从存档结尾附近复制一个文件。实际复制花了一段时间才开始(我认为httpfs2
是“快进”到所选文件),然后一切顺利。我敢肯定整个存档从未被发送过。
服务器进程是apache2
。类似测试python3 -m http.server 80
在安装阶段失败;这个服务器太简单了。
答案2
你可能不能做这样的事。
因为在线存档文件实际上驻留在远程计算机上,所以如果您想在线进行提取,那实际上是远程主机在执行这项工作,而不是您的 CPU。并且要做到这一点,远程主机应该提供列出或提取存档文件的能力,只有这样它才不仅仅是 ftp 的使用。