繁体   English   中英

同时读取和提取tar文件,可能使用python和/或bash

[英]Reading and extract tar file at the same time, possibly using python and/or bash

网络上有一个非常大的tar文件(1.2 TB),其中包含许多高分辨率图像(可能在被替换的文件中)和一些文本文件。 我需要所有图像,但只需要较低的分辨率,还需要文本文件。 但是我没有足够的空间下载整个文件。 同样,大的tar文件也支持下载简历。

所以我想做一个脚本,仅下载文件的一部分,提取包含的文件并进行处理。 然后执行下一部分,依此类推。 可能是python应该是最简单的方法,不是吗? 还是bash脚本? 我怎样才能做到这一点?

我自己的部分答案,以便启动Ideas,不幸的是,我似乎对python或bash不够熟练,无法了解最优雅,最直接的方法,但以下是我发现的内容:

Python具有以下tar模块: https ://docs.python.org/3/library/tarfile.html,

并且还有该文件恢复下载脚本: http : //code.activestate.com/recipes/83208-resuming-download-of-a-file/

但是我不知道如何将它们粘在一起。

另外,我可以使用bash同时下载和解压缩文件,但是我该如何递归执行此操作(请记住可能需要输入其他tar文件或需要相应处理的文本文件),这也是可恢复的? http://www.howtogeek.com/howto/uncategorized/linux-quicktip-downloading-and-un-tarring-in-one-step/

一个想法是使用bash和python的科学怪人。 那就是使用curl和untar分别获取文件,然后将文件传递给我自己的脚本进行处理,然后在脚本中进行所有检查:

curl http://wordpress.org/latest.tar.gz | tar xz | python myScript

curl可以支持简历: http : //www.cyberciti.biz/faq/curl-command-resume-broken-download/

但是,我们会遇到以下问题:tar是否可恢复!

您可以在python中执行此操作,但这并不简单。 完全没有

您可以使用tarfile.open并提供fileobj参数。

从技术上讲可以直接从urllib.urlopen提供一些东西。 主要问题在于,由于您要处理的数据量超过1 TB,因此传输失败。

如您所说,您需要按需重试传输。 最好的选择是制作一个类似文件的对象,该对象可以从URL进行弹性读取,以处理断开连接和超时。 显然, urllib3将自动执行此操作 ,因此您无需重新发明轮子。

另一个问题是(正常) tar文件没有索引。 如果不先处理整个tar就无法真正列出其中的文件-因此,您需要在它们出现时提取它们。 似乎没有内置的方法来执行此操作, 并且在提取每个文件后重新获得流控制(即:回调),因此您必须自己编写它。 看一下TarFile.extractall的源代码,看它是如何完成的( print inspect.getsource(tarfile.TarFile.extractall)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM