ls 命令详解
更新时间:2026-08-29。本文是「一个命令一个文档」系列,属于文件与目录操作命令族。
ls可能是你敲得最多的命令——打开终端第一件事往往就是ls看看在哪、有什么。
为什么单独写 ls?因为它太基础,反而没人认真学过。很多人只会 ls 和 ls -l,遇到"按大小排个序""只看目录不看文件"就卡住,转头去搜。其实 ls 的选项把九成日常需求都覆盖了,读懂权限字符串更是每个 Linux 用户的必修课。
ls(list,列出)把目录里的条目打印出来。它不改任何东西,纯"看",是探索文件系统的眼睛。
一、最基本的用法
ls # 列出当前目录可见条目(不含隐藏文件)
ls /var/log # 列出指定目录
ls -l # 长格式,能看到权限、大小、时间、所有者
ls -a # 连隐藏文件(以 . 开头)一起列新手常困惑:为什么
.bashrc看不到?因为 Unix 默认隐藏点号开头的文件,ls不显示,必须加-a(all)。而ls -A类似-a但不显示.和..这两个特殊目录,日常更干净。
二、权限字符串:drwxr-xr-x 到底什么意思
ls -l 输出第一列那串 drwxr-xr-x 是很多人眼里的天书。拆开看:
d rwx r-x r-x
│ │ │ │
│ │ │ └─ 其他人(other)权限:读+执行
│ │ └────── 同组(group)权限:读+执行
│ └─────────── 所有者(owner)权限:读+写+执行
└─────────────── 类型:d=目录,'-'=普通文件,l=链接权限三位一组,分别是所有者 / 同组 / 其他人,每位 r(读) w(写) x(执行,- 表示无)。所以 rwxr-xr-x 意思是:所有者全权,组和其他人只能读和进目录。文件还是目录由首个字符决定(d 目录、- 文件、l 软链接、b/c 设备)。
想深究权限位与 chmod 数字(755 怎么来的),见 chmod。
ls -l的第三、四列是所有者和所属组,改它们用 chown。
三、高频选项一张表(覆盖九成场景)
| 选项 | 作用 | 示例 |
|---|---|---|
-l | 长格式,显示权限/大小/时间/属主 | ls -l |
-a / -A | 显示隐藏文件 / 不含 . .. | ls -a |
-h | 大小 human-readable(K/M/G) | ls -lh(配合 -l) |
-t | 按修改时间排序(新在前) | ls -lt |
-S | 按文件大小排序(大在前) | ls -lS |
-r | 反转排序结果 | ls -ltr(最旧在前) |
-R | 递归列出子目录内容 | ls -R src |
-d | 只列目录本身,不进目录 | ls -ld /var/log |
-i | 显示 inode 号 | ls -li |
-1 | 每行一个条目 | ls -1 |
--color | 按类型着色(多数发行版默认开) | ls --color=auto |
--time-style | 自定义时间格式 | ls -l --time-style=long-iso |
-h必须和-l一起用才有意义——单独ls -h没东西可"人性化"。ls -lh是看文件大小的标配组合。排错时ls -ltr极好用:按时间倒序后,最后一个就是最新改的文件。
四、实战 demo
demo 1:找出当前目录最近改动的 5 个文件
ls -lt | head -6
# 输出按修改时间从新到旧,-lt 已排序,head 取前几行
# 第 1 行是总计行,所以 head -6 实际看到 5 个文件这比 find . -mtime 快得多,适合"刚才我改了哪个文件来着"的场景。
demo 2:按大小找出占用空间最大的文件
ls -lS | head -10
# -S 按大小降序,立刻看到TOP文件
# 注意:这是"文件大小"排序,不是"目录总占用";看目录总占用用 du,见 dudemo 3:递归列出但只看目录结构(不展开文件)
ls -d */ # 当前目录下的子目录(*/ 是 glob 只匹配目录)
ls -R -d */ # 递归显示所有层级的目录(部分 ls 版本需配合)
# 更通用地看目录树用 tree,见 treedemo 4:确认某个路径是文件还是目录、权限如何
ls -ld /var/log
# -d 关键:不加 -d 会列出 /var/log 里面的内容;
# 加了只显示 /var/log 自身这一行,方便看它自己的权限和类型demo 5:给输出加 inode,排查硬链接
ls -li
# 第一列 inode 号相同的多个文件,就是硬链接(指向同一数据块)
# 配合 ln 创建硬链接,见 ln五、和 ll / stat 的关系
很多系统里 ll 只是 ls -alF 的别名(在 .bashrc 里 alias ll='ls -alF')。所以 ll 看到的隐藏文件 + 长格式 + 类型标记(/ 表示目录、* 表示可执行)其实都是 ls 的选项组合,没有魔法。
type ll # 看看 ll 到底是不是别名、指向什么
ls -lF # 等价于 ll 的部分功能(F 加类型指示符)当你需要比 ls 更细的时间戳或单个文件的精确信息时,ls 不够用,得请出 stat:
stat app.log # 显示访问/修改/变更三个时间、inode、权限位等完整元数据六、常见坑
ls通配符由 shell 展开:ls *.txt是 shell 先找出所有 .txt 再传给 ls,目录里文件极多时可能"参数过长",改用ls -d *.txt或 find。- 文件名含空格时
ls输出会误导你以为是两个文件;-b选项能把不可打印字符转义显示,看清单真实名字。 - 想按内容修改时间之外的"访问时间"排序?
ls -lu(atime)或ls -lc(ctime),但注意 ctime 是元数据变更时间而非创建时间。
七、进阶:把 ls 嵌进日常排障
ls 单列目录只是起点,组合一下就能回答更实际的问题:
# 找"最近改过的 5 个文件"——比 find 快,适合刚改完想确认
ls -lt | head -6
# 看某个目录下各子目录占用(不看文件明细)
du -sh */ | sort -h # du 算大小,sort -h 按人类可读单位排
# 确认软链指向哪、别被名字骗
ls -l /usr/bin/python* # 第一列 l 开头 + -> 指向才是真相
# 文件名含空格时,用 -b 让不可打印字符现形
ls -lb这里有个关键区分:ls -lS 排的是"单个文件大小",不是"目录总占用"。想知道 node_modules 整体多大,得靠 du -sh node_modules,ls 单独列目录时看到的大小只是目录项本身的元数据大小(通常几 KB),不是里面内容。新手常在这里误判"目录很小"。
八、排序与时间的细节边界
ls -t用 mtime(内容修改时间)排序,但ls -lu用 atime、ls -lc用 ctime。想"按创建时间排"?Linux 没有创建时间字段,ls做不到,得用 stat 的Btime(部分文件系统支持)。--time-style决定日期显示格式:ls -l --time-style=long-iso输出2026-08-29 10:23,脚本解析友好;默认locale格式常带中文"8月",机器读着别扭。- 彩色输出靠
--color=auto:自动在终端开、管道关。写进脚本取纯文本时若看到乱码转义符,确认没被强制--color=always。 - 通配符爆炸:目录里文件极多时
ls *.txt会先被 shell 展开成超长参数列表报"参数过长",改用ls -d *.txt或干脆find . -maxdepth 1 -name '*.txt'。
这张图厘清四个"看"的边界:
ls看条目、du 看目录累计、stat 看单文件、df 看磁盘总量。四件套配齐,磁盘类问题基本不用换工具。
相关命令
一句话总结
ls = 列出目录内容的眼睛:-l 看权限(drwxr-xr-x 三组分属主/组/其他)、-h 人性化大小、-t/-S 按时间/大小排序、-R 递归、-d 只看目录自身;ll 只是它的别名组合。读懂权限字符串、记住 ls -lh 和 ls -ltr,九成列目录需求都不用再查。