我有一个tar.gz
32 GB 的文件。我试图从中提取特定文件夹,因此我使用以下命令列出内容以查看文件结构:
tar -tvf file.tar.gz > files.txt
列出所有文件似乎需要很长时间。我的问题是 -t 标志是否也会提取文件?我知道它不会在磁盘上提取,但它所花的时间让我怀疑它是否真的在某种缓冲区中处理它们。
答案1
tar.gz 文件没有索引。与 zip 或其他存档格式不同,获取所含文件或其他元数据的列表既不简单也不便宜。为了向您显示存档中包含哪些文件,tar 确实需要解压缩存档并提取文件,尽管在此-t
选项的情况下它仅在内存中执行此操作。
如果您的用例中的常见模式是列出档案中包含的文件,则您可能需要考虑使用可以向压缩文件添加文件索引的档案格式,例如 zip。
也许你还想看看HDF5适合更复杂场景的格式。
测量
我只需要做一些测量来证明我的答案,并创建一些包含许多文件的目录并将它们打包,tar czf files#.tgz files#
并且zip -r files#.zip files#
。
为了进行测试,我每次运行两次解压命令并获取第二次运行的结果,以尽量避免测量磁盘速度。
测试 1
目录files1
包含100,000 个空文件。
$ 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
zip 在这里比较慢。
测试 2
目录files2
包含5,000 个文件,大小为 512 字节每个都是随机数据。
$ 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
仍然没有说服力,但这次 zip 更快了。
测试 3
目录files3
包含5,000 个 5kB 文件每个都是随机数据。
$ 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
在这个测试中可以看出,文件越大,tar 列出它们就越困难。
结论
对我来说,zip 似乎引入了一些开销,您只会在处理许多非常小(几乎是空的)的文件时才会注意到,而对于大量较大的文件,在列出档案中包含的文件时它会赢得竞争。