目录大小是如何计算的?

目录大小是如何计算的?

我在我的 CentOS 7.3 实例上运行了这个。

[user01@ ~]$ rm -rf my-very-own-directory/
[user01@ ~]$ mkdir my-very-own-directory/ 
[user01@ ~]$ stat my-very-own-directory/ | grep "Size"
  Size: 6           Blocks: 0          IO Block: 4096   directory
[user01@ ~]$ mkdir my-very-own-directory/00
[user01@ ~]$ stat my-very-own-directory/ | grep "Size"
  Size: 16          Blocks: 0          IO Block: 4096   directory
[user01@ ~]$ date > my-very-own-directory/date.txt 
[user01@ ~]$ stat my-very-own-directory/ | grep "Size"
  Size: 32          Blocks: 0          IO Block: 4096   directory
[user01@ ~]$ echo "content" > my-very-own-directory/content
[user01@ ~]$ stat my-very-own-directory/ | grep "Size"
  Size: 47          Blocks: 0          IO Block: 4096   directory
  • 初始创建 => 大小 = 6
  • 添加名称长度为 2 个字节的条目 => 大小为 16 (6 + 8 + 2)
  • 添加另一个名称长度为 4 字节的条目 => 大小为 32 (16 + 8 + 8)
  • 添加另一个名称长度为 7 字节的条目 => 大小为 47 (32 + 8 + 7)

2个问题:

  1. 创建的目录大小为6,为什么?
  2. 目录的每个新条目,无论是子目录的文件,都会增加“我自己的目录”的大小。问题是,大小增加了8+(文件名/目录名的长度)。为什么是8?

答案1

目录格式完全取决于文件系统。

至少,目录条目必须包含文件名和索引节点号。

要使用Linuxext4文件系统(和旧版本)作为示例,原始目录条目具有索引节点号(4 字节)、文件名长度(2 字节)和总条目长度(2 字节),加上文件名本身。 (IIRC 明确指定总长度以允许填充等。)

当前版本(来自ext3)还支持树型存储,它允许更快地查找包含大量文件的目录,但格式当然更复杂。

尽管在 上ext4,目录的大小仅显示为块大小的倍数,即空目录具有大小4096,并且在创建足够的文件需要为其分配新数据块之前它不会增加。

RHEL 7 使用 XFS 作为默认文件系统,因此您可能正在运行该系统。XFS 有多种目录格式,用于小目录的缩写形式本质上具有相同的最小索引节点号+文件名+文件名长度+总长度集。

相关内容