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


9

我有tar.gz32 GB 的文件。我试图从中提取特定文件夹,所以我使用以下命令列出了内容,以查看文件结构:

tar -tvf file.tar.gz > files.txt

列出所有文件似乎要花费很多时间。我的问题是-t标志也提取文件吗?我知道它不会提取到磁盘上,但是花费的时间让我想知道它是否实际上在某种缓冲区中处理它们。


1
您忘记了以下-z选项:tar -tvfz。类似:如果您使用命令tar tvf而不是tar tvfz,会发生什么?
smci

3
@smci:它是自动检测到的,因此并未被真正遗忘。
Ry-

Answers:


14

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

拉链在这里比较慢。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.