ls与du统计占用空间大小的区别
data-ad-format="fluid" data-ad-layout-key="-7k+ex-4a-9w+4a">ls 命令显示的文件大小是通过读取文件系统的元数据(metadata)获取的,具体来说是读取文件的 inode 信息 中的大小字段。以下是详细解释:
一、获取文件大小的底层原理
文件系统存储元数据每个文件在 Linux 系统中都对应一个 inode(索引节点),其中记录了文件的关键属性:
文件大小(字节数)
创建/修改/访问时间
权限、所有者
数据块在磁盘上的存储位置等
ls 命令通过系统调用(如 stat() 或 lstat())读取这些元数据,从而获取文件大小。(https://www.calcguide.tech/2025/08/20/ls与du统计占用空间大小的区别/)
ls 命令的实现逻辑当执行 ls -l 或 ls -s 时,ls 会:
遍历目标目录下的所有文件/目录
对每个文件调用 stat() 系统调用,获取 inode 中的 st_size 字段(文件大小,单位字节)
根据用户指定的格式(如 -h 显示人类可读单位,-k 显示 KB 等)转换并展示大小
二、不同 ls 选项的文件大小显示
ls 提供多种选项控制文件大小的显示方式,本质都是对 st_size 字段的转换:
选项含义示例(1024字节文件)默认(无)显示字节数(st_size 原始值)1024-h人类可读格式(自动转换为 K/M/G)1.0K-k以 KB(1024字节)为单位1-l长格式中显示字节数(同默认)1024-s显示磁盘占用块数(每个块默认512字节)2(1024/512=2块)
三、特殊情况说明
目录的大小ls -l 显示的目录大小通常是固定值(如 4096 字节),这是目录本身的 inode 元数据占用的磁盘块大小,而非目录内所有文件的总大小。若要查看目录内所有文件的总大小,需用 du -sh 目录名。
符号链接(软链接)ls -l 显示的是软链接本身的大小(通常是链接目标路径的字符串长度),而非目标文件的大小。若要查看目标文件大小,需用 ls -lL 链接名(-L 跟随链接)。
稀疏文件(Sparse File)稀疏文件的 ls 显示大小(st_size)可能远大于实际磁盘占用(如虚拟机镜像文件),因为其未写入数据的区域不占用磁盘空间。
四、验证:手动查看文件大小元数据
可以通过 stat 命令直接查看文件的元数据,对比 ls 的结果:
1 | # 查看文件的元数据 |
总结:ls 的文件大小来自文件系统的 inode 元数据,通过系统调用读取后转换为用户指定的格式,不同选项仅影响显示单位,不改变原始大小值。