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

ls 命令显示的文件大小是通过读取文件系统的元数据(metadata)获取的,具体来说是读取文件的 inode 信息 中的大小字段。以下是详细解释:

一、获取文件大小的底层原理

  1. 文件系统存储元数据
    每个文件在 Linux 系统中都对应一个 inode(索引节点),其中记录了文件的关键属性:
    • 文件大小(字节数)
    • 创建/修改/访问时间
    • 权限、所有者
    • 数据块在磁盘上的存储位置等

ls 命令通过系统调用(如 stat() 或 lstat())读取这些元数据,从而获取文件大小。
(https://www.calcguide.tech/2025/08/20/ls%e4%b8%8edu%e7%bb%9f%e8%ae%a1%e5%8d%a0%e7%94%a8%e7%a9%ba%e9%97%b4%e5%a4%a7%e5%b0%8f%e7%9a%84%e5%8c%ba%e5%88%ab/)

  1. 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块)

三、特殊情况说明

  1. 目录的大小
    ls -l 显示的目录大小通常是固定值(如 4096 字节),这是目录本身的 inode 元数据占用的磁盘块大小,而非目录内所有文件的总大小。
    若要查看目录内所有文件的总大小,需用 du -sh 目录名
  2. 符号链接(软链接)
    ls -l 显示的是软链接本身的大小(通常是链接目标路径的字符串长度),而非目标文件的大小。
    若要查看目标文件大小,需用 ls -lL 链接名-L 跟随链接)。
  3. 稀疏文件(Sparse File)
    稀疏文件的 ls 显示大小(st_size)可能远大于实际磁盘占用(如虚拟机镜像文件),因为其未写入数据的区域不占用磁盘空间。

四、验证:手动查看文件大小元数据

可以通过 stat 命令直接查看文件的元数据,对比 ls 的结果:

# 查看文件的元数据
stat example.txt

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

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

此条目发表在linux文章分类目录。将固定链接加入收藏夹。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注