是否可以广度优先搜索 .tar.gz 文件?

mhd*_*adk 9 tar wget

我想从这里下载一个大的(199GB).tar.gz 文件的一部分。首先,我使用以下命令列出 .tar.gz 文件中的所有文件:

wget -qO- https://www.cs.cornell.edu/projects/megadepth/dataset/Megadepth_v1/MegaDepth_v1.tar.gz | tar -tz
Run Code Online (Sandbox Code Playgroud)

接下来,我尝试使用以下命令下载 .tar.gz 中文件夹的内容:

wget -qO- https://www.cs.cornell.edu/projects/megadepth/dataset/Megadepth_v1/MegaDepth_v1.tar.gz | tar -xz phoenix/S6/zl548/MegaDepth_v1/0000
Run Code Online (Sandbox Code Playgroud)

但是,这花费的时间太长,因为该tar命令会深度优先并递归地搜索下面的每个文件夹phoenix/S6/zl548/MegaDepth_v1。我只对文件夹的内容感兴趣phoenix/S6/zl548/MegaDepth_v1/0000。有没有办法下载该文件夹的内容,而不需要搜索其他文件夹的子文件夹,例如

phoenix/S6/zl548/MegaDepth_v1/0162
phoenix/S6/zl548/MegaDepth_v1/0001
phoenix/S6/zl548/MegaDepth_v1/0132
Run Code Online (Sandbox Code Playgroud)

换句话说,有没有更快的方法来下载文件夹的内容phoenix/S6/zl548/MegaDepth_v1/0000


上述命令的一些参考:

如何从 tar.gz 中提取特定文件

如何下载存档并将其解压而不将存档保存到磁盘?

/sf/ask/189021451/

Edu*_*ani 19

tar写入文件头,然后写入文件内容,然后写入下一个文件头,下一个文件内容,依此类推。

条目没有关联的顺序,您可以想到的唯一优化是跳过文件的内容,直接查找下一个标头。为此,您需要有一个可查找的文件。

但是您的文件.gz已被压缩,因此您没有可靠的方法可以跳到下一个条目,这意味着您必须阅读(下载)整个文件才能获取内容。这就是答案:不,您无法避免阅读/下载整个文件。

因此,由于无论如何您都必须完全下载它,因此您最好只下载一次,然后解决本地文件系统中的所有问题。


ilk*_*chu 6

因为 tar 命令深度优先且递归地搜索......

嗯,实际上并非如此。它根本搜索 ,而只是读取存档,查看它遇到的每个文件,看看它们是否与它想要的相匹配。(您确实获得了深度优先的行为,因为这是遍历目录树的自然顺序,也是文件添加到存档中的顺序。)

这是因为 tar 存档没有索引,因此不可搜索。名称“tar”代表“磁带存档”,使用磁带的通常模式是仅读取或写入单个流,而不进行查找。该格式是针对该上下文而设计的,可能不是最适合您的用例的格式。

我找不到对此的良好引用,但在网站和维基百科的一些 答案中提到了它。


Pre*_*rem 6

每次执行时wget,您都在尝试下载整个 tar 文件!您可能已经多次下载“初始内容”,并通过将输出发送到 stdout 将其丢弃!

相反,“更快”的方法是将其下载一次到当前目录中的 ./MegaDepth_v1.tar.gz 并在那里解压缩。

wget -q -O MegaDepth_v1.tar.gz  https://www.cs.cornell.edu/projects/megadepth/dataset/Megadepth_v1/MegaDepth_v1.tar.gz  
tar -xz -f MegaDepth_v1.tar.gz phoenix/S6/zl548/MegaDepth_v1/0000  
Run Code Online (Sandbox Code Playgroud)

获得必要的文件后,您可以删除下载的 tar 文件。

更新:原始文件的大小似乎约为 200 GB。下载本身会占用大量的时间和空间。提取将花费额外的时间。在这种情况下,没有胜利
您可能需要联系 MegaDepth 团队并要求他们提供单独的目录访问权限,否则速度总是很慢。

在这里,wget无法跳过不需要的内容,并且始终会从头到尾下载整个 tar 文件。此外,(如用户 ilkkach 的回答中所述)tar无法跳过(或查找)stdout 流。