ls与du统计占用空间大小的区别

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
2
3
4
5
6
7
# 查看文件的元数据
stat example.txt

# 输出中与大小相关的字段:
# Size: 1024 (文件逻辑大小,同 ls 显示的字节数)
# Blocks: 8 (实际占用磁盘块数,同 ls -s 显示的值)

总结:ls 的文件大小来自文件系统的 inode 元数据,通过系统调用读取后转换为用户指定的格式,不同选项仅影响显示单位,不改变原始大小值。

data-ad-format="auto" data-full-width-responsive="true">