ls 是什么
ls 读取目录项并输出,来自 coreutils。三个默认行为决定了它的使用手感:不显示以点开头的隐藏文件、按名称排序、把结果排成多列以适应终端宽度。加上 -l 后是长格式,每行包含权限、链接数、属主、属组、大小、时间、名称七段信息,前面还有一行 total 表示这些文件占用的块数。需要注意 ls -l 显示的大小是文件长度(apparent size),不是磁盘实际占用,目录显示的数值也不是内容总量。
基本信息
| 适用平台 | Linux 全发行版与 macOS(GNU coreutils / BSD ls);-h、-S、--time-style 等属 GNU 常见扩展,BSD 版部分选项不同 |
|---|---|
| 命令语法 | ls [选项] [路径...];不给路径默认列当前目录 |
| 常用选项 | -l 长格式、-a 含隐藏文件、-A 含隐藏文件但不含 . 与 ..、-h 人类可读大小、-t 按修改时间排序、-S 按大小排序、-r 反向、-R 递归、-d 只列目录本身、-1 单列输出、-i 显示 inode、-n 用数字显示属主 |
| 权限要求 | 列出目录内容需要该目录的 r 权限;要看到属主、权限、时间等元数据还需要 x 权限 |
| 输出稳定性 | 颜色、排序与字段宽度都会随 locale、终端与别名变化,不适合作为脚本的解析输入 |
典型使用场景
- 快速确认内容与归属:ls -alh 一眼看到权限、属主、大小与隐藏文件
- 找最近改动的文件:ls -lt 按时间倒序,配合 head 定位最新产物
- 找大文件:ls -lSh 按大小排序,先粗筛再进 du 精确定位
- 查 inode:-i 配合 -a 判断两个名字是否指向同一数据(硬链接),排查删除异常时也会用到
- 只看目录本身:ls -ld /etc 不展开内容,只看这个目录的权限与属主
- 核对文件类型:首列字符区分普通文件、目录、符号链接、设备与套接字
常用示例
常用示例
ls -alh # 全部文件 + 长格式 + 可读大小
ls -lt --time-style=long-iso | head # 按时间倒序,ISO 格式更好读
ls -lSh /var/log | head -n 10 # 按大小倒序找大文件
ls -ld /etc /var # 只看目录本身
ls -lRi /data | head -20 # 递归并显示 inode
ls -F /usr/bin | head # 用符号标注类型(/ 目录、* 可执行)
ls -l --block-size=1 bigfile # 精确到字节,便于计算长格式逐列读法
| 位置 | 含义 | 怎么看 |
|---|---|---|
| 首字符 | 文件类型:- 普通文件、d 目录、l 符号链接、c/b 字符或块设备、s 套接字、p 命名管道 | 先确认类型再理解后面的权限 |
| 后 9 位 | 权限位,按属主、属组、其他人三段排列 rwx | 看到 s 或 t 说明有 SUID/SGID/sticky 特殊位 |
| 链接数 | 硬链接计数;对目录来说是子目录数加 2 | 突然变大要留意是否被挂载点影响 |
| 属主与属组 | 文件的所有者与所属组,-n 可显示为数字 UID/GID | 残留的旧账号数字 ID 是迁移后的常见现象 |
| 大小 | 文件长度(apparent size);目录显示的是目录项自身大小 | 不是磁盘占用,也不代表目录内容总量 |
| 时间 | 默认显示修改时间 mtime | 访问时间与 inode 变更时间要用 stat 查看 |
ls -l 首行的 total 是该目录下文件占用的块数(GNU 默认以 1KiB 为单位),可以粗略理解为这批文件的磁盘占用,但它不含子目录内容,也不是目录大小。
-a 会连 . 与 .. 一并列出,脚本里通常只需要 -A(列出隐藏文件但不含这两个),再配合 -1 单列输出与 --color=never 便于比较。
不要用 ls 的输出做脚本判断:文件名可以包含空格、换行与通配符,颜色码与排序受 locale 影响。要可靠地遍历文件用 find -print0 配 xargs -0,要读取元数据用 stat --printf。