为什么 TAR 文件比其内容小?
我有一个正在归档的目录:
$ du -sh oldcode
1400848
$ tar cf oldcode.tar oldcode
所以该目录是 1.4gb。 不过,该文件要小得多:
$ ls -l oldcode.tar
-rw-r--r-- 1 ieure ieure 940339200 2002-01-30 10:33 oldcode.tar
只有 897mb。 它没有以任何方式压缩:
$ file oldcode.tar
oldcode.tar: POSIX tar archive
为什么 tar 文件比其内容小?
I have a directory I’m archiving:
$ du -sh oldcode
1400848
$ tar cf oldcode.tar oldcode
So the directory is 1.4gb. The file is significantly smaller, though:
$ ls -l oldcode.tar
-rw-r--r-- 1 ieure ieure 940339200 2002-01-30 10:33 oldcode.tar
Only 897mb. It’s not compressed in any way:
$ file oldcode.tar
oldcode.tar: POSIX tar archive
Why is the tar file smaller than its contents?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
发布评论
评论(5)
这与文件系统的块大小有关。 MacOSX 10.5.6 上的 man 1 du 指出:
du 实用程序显示每个文件参数以及以每个目录参数为根的文件层次结构中每个目录的文件系统块使用情况。 如果不指定文件,则显示以当前目录为根的层次结构的块使用情况。
[mirko@borg foo]$ ls -la
total 0
drwxr-xr-x 2 mirko wheel 68 Jan 30 21:20 .
drwxrwxrwt 10 root wheel 340 Jan 30 21:16 ..
[mirko@borg foo]$ du -sh
0B .
[mirko@borg foo]$ touch foo
[mirko@borg foo]$ ls -la
total 0
drwxr-xr-x 3 mirko wheel 102 Jan 30 21:20 .
drwxrwxrwt 10 root wheel 340 Jan 30 21:16 ..
-rw-r--r-- 1 mirko wheel 0 Jan 30 21:20 foo
[mirko@borg foo]$ du -sh
0B .
[mirko@borg foo]$ echo 1 > foo
[mirko@borg foo]$ ls -la
total 8
drwxr-xr-x 3 mirko wheel 102 Jan 30 21:20 .
drwxrwxrwt 10 root wheel 340 Jan 30 21:16 ..
-rw-r--r-- 1 mirko wheel 2 Jan 30 21:20 foo
[mirko@borg foo]$ du -sh
4.0K .
正如您所见,即使是 2 字节的文件也需要一整块 4kb 的空间。 有些文件系统通过块再分配来避免这种空间浪费。
有两种可能性。
小文件
最有可能的是,它不小于其内容。 正如 Nils Pipenbrinck 所写,du
显示文件系统分配的空间量,因为文件是存储在文件系统块中的大小大于文件的逻辑大小。
要查看文件的逻辑大小,请使用du --apparent-size。 在这种情况下,结果应该小于 tar 文件。
稀疏文件
Tar 文件可以存储稀疏文件。 如果 tarball 是使用 --sparse
创建的,稀疏文件中的漏洞将被记录,因此 tarball 可能小于文件的逻辑大小。
如果提取的副本中的稀疏信息以某种方式丢失(例如,如果您将 tarball 提取到不支持稀疏文件的文件系统上,或者如果它被压缩然后解压缩等),则 df
将报告扩展后的大小。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
由于文件系统的工作方式,您会得到不同的结果。
简而言之,您的磁盘是由簇组成的。 每个簇的固定大小为 4 KB。 如果在这样的簇中存储 1kb 文件,则 3kb 将未被使用。 确切的细节因您使用的文件系统的类型而异,但大多数文件系统都是这样工作的。
对于单个文件来说,3kb 浪费的空间并不算多,但如果您有很多非常小的文件,则浪费可能会成为磁盘使用的重要组成部分。
在 tar 归档文件中,文件不是存储在簇中,而是一个接一个地存储。 这就是差异的来源。
You get a difference because of the way the filesystem works.
In a nutshell your disk is made out of clusters. Each cluster has a fixed size of - let's say - 4 kilobytes. If you store a 1kb file in such a cluster 3kb will be unused. The exact details vary with the kind of file-system that you use, but most file-systems work that way.
3kb wasted space is not much for a single file, but if you have lots of very small files the waste can become a significant part of the disk usage.
Inside the tar-archive the files are not stored in clusters but one after another. That's where the difference comes from.