同时读取和提取tar文件,可能使用python和/或bash
web上有一个非常大的tar文件(1.2 TB),其中包含许多高分辨率图像(可能在子共享文件中)和一些文本文件。我需要所有的图像,但只有在一个较低的分辨率,我还需要文本文件。但是我没有足够的空间来下载整个东西。此外,大型tar文件还支持下载简历同时读取和提取tar文件,可能使用python和/或bash,python,bash,download,tar,Python,Bash,Download,Tar,web上有一个非常大的tar文件(1.2 TB),其中包含许多高分辨率图像(可能在子共享文件中)和一些文本文件。我需要所有的图像,但只有在一个较低的分辨率,我还需要文本文件。但是我没有足够的空间来下载整个东西。此外,大型tar文件还支持下载简历 所以我想做一个脚本,只下载文件的一部分,提取包含的文件并处理它。然后做下一部分,依此类推。也许python应该是最简单的方法,不是吗?或者是bash脚本?我如何做到这一点?我自己的部分答案,以便启动想法,不幸的是,我似乎对python或bash不够精通,
所以我想做一个脚本,只下载文件的一部分,提取包含的文件并处理它。然后做下一部分,依此类推。也许python应该是最简单的方法,不是吗?或者是bash脚本?我如何做到这一点?我自己的部分答案,以便启动想法,不幸的是,我似乎对python或bash不够精通,不知道最优雅、最直接的方法,但我发现: Python具有以下模块: , 还有一个文件正在恢复下载脚本: 但我不知道如何把它们粘在一起 我还可以使用bash同时下载和卸载tar,但是我如何递归地完成这项工作(记住,我们可能需要进入其他tar文件,或者我们必须相应地处理文本文件),这也是可以恢复的吗? 一个想法是使用bash和python的弗兰肯斯坦。也就是说,使用curl和untar分别获取文件,然后将文件传递给我自己的脚本进行处理,然后我可以在脚本中进行所有检查:
curl http://wordpress.org/latest.tar.gz | tar xz | python myScript
curl可以支持恢复:
但接下来我们会遇到一个问题:焦油是可回收的吗 您可以在python中实现这一点,但这并不简单。一点也不 您可以使用并提供
fileobj
参数
从技术上讲,你可以直接从中提供一些东西。主要的问题是,由于您正在处理超过1 TB的数据,因此传输将失败
正如您所说,您需要按需重试传输。最好的方法是创建一个类似文件的对象,该对象可以弹性地读取URL,处理断开连接和超时。
显然,你不需要重新发明轮子
另一个问题是(正常)
tar
文件没有索引。如果不先处理整个tar
文件,就无法真正列出其中的文件,因此需要在文件出现时提取它们。似乎没有一种内置的方法可以做到这一点,并在提取每个文件(即回调)后重新获得流控制,因此您必须自己编写。查看TarFile.extractall
的源代码,看看它是如何完成的(print inspect.getsource(TarFile.TarFile.extractall)
)bash是一个好主意,可以为您节省大量实现复杂性wget
可能会自动重试:wget设计用于在缓慢或不稳定的网络连接上保持健壮性;如果由于网络问题导致下载失败,它将继续重试,直到检索到整个文件。如果服务器支持regetting,它将指示服务器从其停止的位置继续下载。
(续)正如您所说,主要问题是知道何时处理其中的文件。如果您在linux上,您可以使用inotify
在新文件出现时收到通知,并相应地处理它们。此外,请选中curl
@goncalopp上的--retry
选项,wget方法将写入文件。所以我仍然需要大硬盘。curl不支持resume,是吗?你可以使用-O-
检查wget
写入stdout
,我正在考虑这个问题。它似乎比管道tar方法干净得多。我已经锁定了extractAll代码,这似乎是“最简单”的方法,所以我将接受它作为答案。