我想从这里下载一个大的(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
?
上述命令的一些参考:
Edu*_*ani 19
tar
写入文件头,然后写入文件内容,然后写入下一个文件头,下一个文件内容,依此类推。
条目没有关联的顺序,您可以想到的唯一优化是跳过文件的内容,直接查找下一个标头。为此,您需要有一个可查找的文件。
但是您的文件.gz
已被压缩,因此您没有可靠的方法可以跳到下一个条目,这意味着您必须阅读(下载)整个文件才能获取内容。这就是答案:不,您无法避免阅读/下载整个文件。
因此,由于无论如何您都必须完全下载它,因此您最好只下载一次,然后解决本地文件系统中的所有问题。
每次执行时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 流。
归档时间: |
|
查看次数: |
2744 次 |
最近记录: |