在 Linux 或更具体的 EXT4 中,目录文件的初始大小为 4kB。但是,如果目录中存储了足够多的文件,则目录文件的大小将由于内部“文件列表”的增加而增加。但是,需要多少个文件才能发生这种情况?我一直无法找到可以回答这个问题的资源。
答案1
ext4目录项的格式为记录在内核中。有两种可能性。
- 对于线性目录,每个条目占用八个字节,加上文件名(以零结尾),四舍五入为四个字节。所以n文件条目占用8×n字节加上所有文件名的长度分别四舍五入到四(包括终止零)。目录始终包含
.
和 ,..
每个目录占用 12 个字节。每个线性目录还可以有一个十二字节的校验和。块中的最后一个条目的记录长度被扩展以覆盖当前块中的剩余空间,因此目录条目永远不会跨越两个文件系统块。 - 对于哈希树目录,每个目录中的第一个数据块都有一个 40 字节的根条目(其中包括
.
和 的文件条目..
),后续的每个数据块都有一个 18 字节的节点。每个节点占用八个字节,文件条目使用与线性目录中相同的数据结构,最终作为线性数组。因此,目录消耗的空间量更难计算:每个文件占用 8 个字节加上其名称长度,四舍五入为 4 个字节,树结构第一个块占用 40 个字节,每个额外块占用 18 个字节,每个节点八个字节。
如果您想快速看到目录大小的增加,请用长文件名的文件填充它 - 文件名的长度最多可达 254 个字节,加上终止的零字节,总共占用 264 个字节,因此每个目录中都有 16 个这样的条目目录类型将需要超过 4096 字节。
要确定目录是线性的还是散列的,请检查其 inode,例如使用debugfs
:
debugfs: show_inode_info /path/to/directory
Inode: 7329 Type: directory Mode: 0755 Flags: 0x1000
Generation: 2283115506 Version: 0x00000001
...
如果目录已散列,则标志将显示 0x1000 设置,否则未设置。
答案2
新目录:
mkdir newtemp
新目录的大小:
ls -l | grep newtemp
drwxr-xr-x 2 jsevans users 6 Jan 11 17:42 newtemp
通过触摸创建一个新的空文件
touch 1
重新检查尺寸:
ls -l | grep newtemp
drwxr-xr-x 2 jsevans users 15 Jan 11 17:42 newtemp
因此需要 1 个文件。
如果这不能回答您的问题,请查看ls 命令的完整文档根据手册页。