![磁盘上的文件与 tar 存档中的文件之间的总大小差异](https://linux22.com/image/204729/%E7%A3%81%E7%9B%98%E4%B8%8A%E7%9A%84%E6%96%87%E4%BB%B6%E4%B8%8E%20tar%20%E5%AD%98%E6%A1%A3%E4%B8%AD%E7%9A%84%E6%96%87%E4%BB%B6%E4%B9%8B%E9%97%B4%E7%9A%84%E6%80%BB%E5%A4%A7%E5%B0%8F%E5%B7%AE%E5%BC%82.png)
我是一名 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
。这里每个文件将占用一个块,目录本身也将占用一个块。
如果您有许多文件(多少取决于文件系统),那么目录本身的大小可能会增加,以便在其中存储文件信息。但目录大小始终是块大小的倍数。