磁盘上的文件与 tar 存档中的文件之间的总大小差异

磁盘上的文件与 tar 存档中的文件之间的总大小差异

我是一名 Linux 新用户,仍在学习中。据我了解,该tar命令(单独且不带z,j或等选项J)默认情况下不压缩文件。它仅将多个文件捆绑到一个文件中。下面是我的测试。

root@u2004:~# du -sh /etc/
11M /etc/
root@u2004:~# tar cf etc.tar /etc
tar: Removing leading `/' from member names
root@u2004:~# du -sh etc.tar 
6.6M    etc.tar
root@u2004:~#

可以看到,/etc目录下的文件总共有11M。将它们归档为单个文件后,新的归档文件为6.6M。大小差异从何而来?是因为文件是连续写入并挤在一起的吗?

答案1

默认情况du下,以“块”为单位测量文件大小。因此,每个小文件(小于块)根据需要占用块的大小,其余部分为空。但它不能被另一文件使用(因为一个块只能属于一个文件)。因此你会“浪费”一些字节。

另一方面tar,连接所有文件。 “浪费”的空间要少得多。

-b如果du您想更好地预测 tar 大小,可以使用 key 。

意思是如果你跑

$ du -shb /etc
$ du -shb etc.tar 

您将得到尺寸彼此更接近的数字。差异将来自文件的描述。第一种情况是目录的大小,第二种情况是 tar 头的大小。

要进一步研究它,您可以从以下开始:

$ df /some_test_dir

这将告诉您该目录位于哪个物理设备(文件系统列)

$ sudo /sbin/dumpe2fs /dev/?? |grep 'Block size'

在这里定义您的设备,您将获得该设备上块的大小。

如果你这样做du /some_test_dir并且该目录是空的 - 你将得到一个块大小。

如果您现在放置一个文件(或许多文件),所有文件的长度都为零,那么du目录上仍然会给出块大小 - 这是因为文件根本不占用任何空间,并且有关它们的信息存储在目录的块内。

对于下一个测试,在此目录中创建 N 个文件,每个文件的大小都小于一个块。实际大小并不重要,它必须大于零,小于块。现在du就给你目录(N+1)*block。这里每个文件将占用一个块,目录本身也将占用一个块。

如果您有许多文件(多少取决于文件系统),那么目录本身的大小可能会增加,以便在其中存储文件信息。但目录大小始终是块大小的倍数。

相关内容