tar -tvf 是解压文件还是只列出名称?

Sai*_*aif 10 command-line tar

我有一个tar.gz32 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#.

对于测试,我每次运行两次解包命令并获取第二次运行的结果,以避免测量磁盘速度。

测试 1

目录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 在这里比较慢。

测试 2

目录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 更快。

测试 3

目录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 似乎引入了一些开销,您只会注意到许多非常小的(几乎是空的)文件,而对于大量较大的文件,它在列出存档中包含的文件时赢得了比赛。