我有一个tar.gz
32 GB的文件。我试图从中提取特定文件夹,因此我使用以下命令列出了内容以查看文件结构:
tar -tvf file.tar.gz > files.txt
Run Code Online (Sandbox Code Playgroud)
列出所有文件似乎需要很长时间。我的问题是 -t 标志是否也提取文件?我知道它不会在磁盘上提取,但是它花费的时间让我怀疑它是否真的在某种缓冲区中处理它们。
Seb*_*ark 15
tar.gz 文件没有索引。与 zip 或其他存档格式不同,获取包含的文件或其他元数据的列表既不简单也不便宜。为了向您显示存档中包含哪些文件,tar 确实需要解压缩存档并提取文件,尽管在-t
选项的情况下它只在内存中执行此操作。
如果您的用例中的常见模式是列出存档中包含的文件,您可能需要考虑使用可以向压缩文件添加文件索引的存档格式,例如 zip。
也许您还想了解更复杂场景的HDF5格式。
我只需要做一些测量来证明我的答案,并创建了一些包含许多文件的目录并将它们打包,tar czf files#.tgz files#
并且zip -r files#.zip files#
.
对于测试,我每次运行两次解包命令并获取第二次运行的结果,以避免测量磁盘速度。
目录files1
包含10万个空文件。
$ time tar tzf files1.tgz >/dev/null
tar tzf files1.tgz > /dev/null 0,56s user 0,09s system 184% cpu 0,351 total
$ time unzip -l files1.zip >/dev/null
unzip -l files1.zip > /dev/null 0,30s user 0,34s system 99% cpu 0,649 total
Run Code Online (Sandbox Code Playgroud)
zip 在这里比较慢。
目录files2
包含与512个字节5000页的文件每个随机数据。
$ time tar tzf files2.tgz >/dev/null
tar tzf files2.tgz > /dev/null 0,14s user 0,03s system 129% cpu 0,131 total
$ time unzip -l files2.zip >/dev/null
unzip -l files2.zip > /dev/null 0,03s user 0,06s system 98% cpu 0,092 total
Run Code Online (Sandbox Code Playgroud)
仍然没有说服力,但这次 zip 更快。
目录files3
包含与5kB的5000个文件的每个随机数据。
$ time tar tzf files3.tgz >/dev/null
tar tzf files3.tgz > /dev/null 0,42s user 0,03s system 111% cpu 0,402 total
$ time unzip -l files3.zip >/dev/null
unzip -l files3.zip > /dev/null 0,03s user 0,06s system 99% cpu 0,093 total
Run Code Online (Sandbox Code Playgroud)
在这个测试中可以看出,文件越大,tar 就越难列出它们。
对我来说,zip 似乎引入了一些开销,您只会注意到许多非常小的(几乎是空的)文件,而对于大量较大的文件,它在列出存档中包含的文件时赢得了比赛。