为什么 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)
由于文件系统的工作方式,您会得到不同的结果。
简而言之,您的磁盘是由簇组成的。 每个簇的固定大小为 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.
由于不知道您正在使用什么 tar 或您正在使用哪种 Unix 系统,我的猜测是:oldcode 包含许多较小的文件,这些文件本身使用磁盘空间效率低下,因为磁盘空间是由某种块分配的,而不是逐字节。 在 tar 文件中,它们被连接起来,并最大限度地利用分配给它们的磁盘空间。
Having no knowledge of what tar you're using or what sort of Unix system you're using, here's my guess: oldcode contains numerous smaller files, which when by themselves use disk space inefficiently, since disk space is allocated by some sort of block, rather than byte by byte. In the tar file, they're concatenated, and make maximum use of the disk space they're assigned.
这与文件系统的块大小有关。 MacOSX 10.5.6 上的 man 1 du 指出:
正如您所见,即使是 2 字节的文件也需要一整块 4kb 的空间。 有些文件系统通过块再分配来避免这种空间浪费。
This has something to do with the blocksize of your filesystem. man 1 du on MacOSX 10.5.6 states:
As you see even a file of 2 bytes takes a whole block of 4kb. There are some filesystems which avoid this waste of space by block suballocation.
有两种可能性。
小文件
最有可能的是,它不小于其内容。 正如 Nils Pipenbrinck 所写,
du
显示文件系统分配的空间量,因为文件是存储在文件系统块中的大小大于文件的逻辑大小。要查看文件的逻辑大小,请使用du --apparent-size。 在这种情况下,结果应该小于 tar 文件。
稀疏文件
Tar 文件可以存储稀疏文件。 如果 tarball 是使用
--sparse
创建的,稀疏文件中的漏洞将被记录,因此 tarball 可能小于文件的逻辑大小。如果提取的副本中的稀疏信息以某种方式丢失(例如,如果您将 tarball 提取到不支持稀疏文件的文件系统上,或者如果它被压缩然后解压缩等),则
df
将报告扩展后的大小。There are 2 possibilities.
Small files
Most likely, it isn't smaller than its contents. As Nils Pipenbrinck wrote,
du
displays the amount of space the filesystem allocates, which since files are stored in filesystem blocks is more than the logical size of the file.To view the logical size of the file, use
du --apparent-size
. In this case, the result should be smaller than the tar file.Sparse files
Tar files can store sparse files. If the tarball was created using
--sparse
, the holes in the sparse files will be recorded, so the tarball could be smaller than the logical size of the files.If the sparseness information in your extracted copy was somehow lost (e.g. if you extracted the tarball onto a filesystem that doesn't support sparse files, or if it was zipped and then unzipped, etc.), then
df
will report the expanded size.du 计算的是磁盘块,而不是文件大小。
du counts disk blocks, not file size duder.