ls
ls(list)列出目录下的文件和子目录,是 Linux 最常用的命令。没有之一。
速查卡片
| 需求 | 命令 |
|---|---|
| 列出当前目录 | ls |
| 长格式(权限/大小/时间) | ls -l |
| 含隐藏文件 | ls -a |
| 含隐藏文件(不含 . ..) | ls -A |
| 人类可读大小 | ls -lh |
| 按时间排序(最新在先) | ls -lt |
| 按大小排序(最大在先) | ls -lS |
| 反向排序 | ls -lr / ls -ltr |
| 递归列出子目录 | ls -R |
| 只列目录 | ls -d */ |
| 每行一个 | ls -1 |
| 带类型标记 | ls -F |
| 彩色输出 | ls --color=auto |
| inode 号 | ls -i |
| 数字 UID/GID | ls -n |
概述
ls 是 GNU coreutils 的核心命令,用于列出文件和目录的元数据——名称、大小、权限、时间戳等。默认按字母排序,输出到终端时默认按列排列方便阅读,管道时默认每行一个以便脚本处理。
核心设计原则:ls 负责"列出文件元数据",不负责"搜索文件"(那是 find 的事)。
命令签名
bash
ls [OPTION]... [FILE]...FILE省略时默认为当前目录.FILE是目录时,列出目录内文件(不递归);用-d列出目录本身- 多个
FILE参数可混用目录和文件
选项表
按功能分组列出。标记 ⚠️ 表示 GNU coreutils 特有(macOS BSD ls 不支持或行为不同)。
显示控制
| 短选项 | 长选项 | 说明 |
|---|---|---|
-a | --all | 显示所有条目(含 . 开头的隐藏文件) |
-A | --almost-all | 显示隐藏文件但不列 . 和 .. |
-d | --directory | 列出目录本身,而非其内容 |
-R | --recursive | 递归列出所有子目录 |
-1 | — | 每行一个文件(管道时默认行为) |
-C | — | 按列排列(终端输出时的默认行为) |
-x | — | 按行排列而非按列 |
-m | — | 逗号分隔输出 |
--zero ⚠️ | — | 每行以 NUL 结尾(\0,供 xargs -0 使用) |
长格式控制
| 短选项 | 长选项 | 说明 |
|---|---|---|
-l | — | 长格式(权限、链接数、所有者、组、大小、时间、名称) |
-h | --human-readable | 大小以人类可读格式显示(1K, 234M, 2G) |
--si ⚠️ | — | 同 -h,但使用 1000 进制而非 1024 |
-k | --kibibytes | 以 KiB(1024 字节)为单位显示 |
-s | --size | 显示每个文件占用的磁盘块数 |
-i | --inode | 显示 inode 编号 |
-n | --numeric-uid-gid | 数字 UID/GID 替代用户名/组名 |
-g ⚠️ | — | 同 -l,但不显示所有者 |
-G | --no-group | 同 -l,但不显示组名 |
-o ⚠️ | — | 同 -l,但不显示组信息 |
--author ⚠️ | — | 配合 -l,显示每文件的作者 |
-Z | --context | 显示 SELinux 安全上下文 |
--full-time ⚠️ | — | 等同 -l --time-style=full-iso |
排序
| 短选项 | 长选项 | 说明 |
|---|---|---|
| (默认) | — | 按名称字母排序 |
-t | — | 按修改时间排序,最新在先 |
-S | — | 按文件大小排序,最大在先 |
-v ⚠️ | — | 按版本号自然排序(file1 < file2 < file10) |
-X ⚠️ | — | 按扩展名字母排序 |
-U | — | 不排序(目录原始顺序,最快) |
-r | --reverse | 反向排序(与上述任意排序配合) |
-f | — | 等同 -aU(显示全部、不排序) |
时间戳选择
| 短选项 | 说明 |
|---|---|
| (默认) | 显示/排序"修改时间"(mtime) |
-c | 配合 -lt:按状态变更时间(ctime)排序并显示;配合 -l:显示 ctime |
-u | 配合 -lt:按访问时间(atime)排序并显示;配合 -l:显示 atime |
| 长选项 ⚠️ | 说明 |
|---|---|
--time=atime | 使用访问时间 |
--time=ctime | 使用状态变更时间 |
--time=birth | 使用创建时间(部分文件系统支持) |
格式与过滤
| 短选项 | 长选项 | 说明 |
|---|---|---|
-F | --classify | 文件名后追加类型标记:/=目录、*=可执行、@=符号链接、|=FIFO、==套接字 |
--file-type ⚠️ | — | 同 -F,但不加 * 标记可执行文件 |
-p | --indicator-style=slash | 仅在目录后追加 / |
-Q | --quote-name | 文件名用双引号包裹 |
-b | --escape | 不可打印字符以 C 风格转义 |
-q | --hide-control-chars | 不可打印字符显示为 ? |
-N | --literal | 原样输出文件名,不加引号 |
-B | --ignore-backups | 不显示以 ~ 结尾的备份文件 |
--hide=PATTERN ⚠️ | — | 隐藏匹配 shell 模式的文件(-a/-A 可覆盖) |
-I | --ignore=PATTERN | 同 --hide |
颜色与外观
| 短选项 | 长选项 ⚠️ | 说明 |
|---|---|---|
| — | --color=always | 始终彩色输出 |
| — | --color=auto | 仅在标准输出是终端时彩色(推荐) |
| — | --color=never | 永不彩色(默认行为) |
| — | --group-directories-first | 目录排在最前面,然后才是文件 |
符号链接处理
| 短选项 | 长选项 ⚠️ | 说明 |
|---|---|---|
| (默认) | — | 显示符号链接本身的信息 |
-L | --dereference | 显示符号链接指向的目标文件的信息 |
-H | --dereference-command-line | 仅对命令行参数中的符号链接解除引用 |
其他
| 短/长选项 | 说明 |
|---|---|
-T, --tabsize=COLS ⚠️ | 制表符宽度(默认 8) |
-w, --width=COLS ⚠️ | 输出宽度(0=不限制) |
--hyperlink[=WHEN] ⚠️ | 为文件名添加超链接(终端支持时) |
-D, --dired ⚠️ | 生成 Emacs Dired 模式输出 |
--help | 显示帮助 |
--version | 显示版本号 |
基础用法
示例一:最简用法
bash
# 列出当前目录
ls
# 列出指定目录
ls /etc
# 列出多个目录
ls /etc /var示例二:长格式——日常 80% 的使用
bash
# 长格式
ls -l
# 长格式 + 人类可读大小
ls -lh
# 长格式 + 隐藏文件
ls -la
# 长格式 + 人类可读 + 所有文件(不含 . ..)
ls -lhAls -l 输出示例及字段含义:
-rw-r--r-- 1 alice developers 4096 Jul 12 10:30 README.md
|________| | |____| |________| |___| |___________| |_______|
① ② ③ ④ ⑤ ⑥ ⑦| 编号 | 字段 | 说明 |
|---|---|---|
| ① | 类型与权限 | 首字符:-=普通文件、d=目录、l=符号链接、b=块设备、c=字符设备、s=套接字、p=FIFO。后 9 位:三组 rwx(所有者/组/其他) |
| ② | 硬链接数 | 文件/目录的硬链接数量 |
| ③ | 所有者 | 用户名 |
| ④ | 所属组 | 组名 |
| ⑤ | 文件大小 | 文件实际占用的字节数,非磁盘块占用 |
| ⑥ | 修改时间 | 默认显示 mtime |
| ⑦ | 文件名 | 符号链接会显示 link → target |
特殊权限位(出现在第 ① 字段的 x 位置):
| 字符 | 含义 |
|---|---|
s(所有者段) | SUID——执行时以文件所有者身份运行 |
S(所有者段) | SUID 已设置但无执行权限(大写=无意义,但存在) |
s(组段) | SGID——执行时以文件所属组身份运行 |
S(组段) | SGID 已设置但无执行权限 |
t(其他段) | Sticky bit——仅所有者可删除(常见于 /tmp) |
T(其他段) | Sticky bit 已设置但无执行权限 |
示例三:排序组合
bash
# 按修改时间排序(最新在最前)
ls -lt
# 按修改时间排序(最旧在最前)
ls -ltr
# 按文件大小排序(最大在前)
ls -lS
# 按大小 + 人类可读 + 反向(最小在前)
ls -lShr
# 按扩展名排序
ls -lX
# 版本号自然排序(file1 < file2 < file10)
ls -lv示例四:冷门但实用的用法
bash
# 只看目录(不展开内容)
ls -d */
# 看目录本身的属性(而非其内容)
ls -ld /tmp
# 查看 inode 号
ls -i
# 数字 UID/GID(适用于跨系统查看)
ls -n
# 查看不同时间戳
ls -l --time=atime # 访问时间
ls -l --time=ctime # 状态变更时间
ls -lc # 同上(短选项)
# 递归 + 只看目录结构(类似 tree)
ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\// |--/g'
# 带类型标记显示(文件类型一目了然)
ls -F
# 输出示例:
# bin/ ← 目录
# script* ← 可执行文件
# link@ ← 符号链接
# pipe| ← 命名管道
# 逗号分隔(便于脚本解析)
ls -m
# NUL 分隔(配合 xargs -0 安全处理含空格的文件名)
ls --zero | xargs -0 -I {} echo "Processing: {}"输出字段详解
ls -l 的文件大小
ls -l 显示的大小是文件的逻辑大小(文件占用的字节数),不是 磁盘块占用。
bash
# 一个空洞文件(sparse file):ls 显示 1GB,du 显示 0
truncate -s 1G sparse.bin
ls -lh sparse.bin # → 1.0G
du -h sparse.bin # → 0(未实际分配磁盘块)
# 查看磁盘块占用用 du,不用 ls
du -sh directory/时间戳类型
| 时间戳 | 含义 | 短选项 | 长选项 |
|---|---|---|---|
| mtime | 文件内容最后修改时间(默认) | — | --time=mtime |
| atime | 最后访问时间 | -u | --time=atime |
| ctime | 元数据最后变更时间(权限/所有者等) | -c | --time=ctime |
| birth | 文件创建时间 | — | --time=birth |
注意:
-u和-c单独使用时含义微妙——它们同时影响排序依据和显示列。推荐用--time=长选项明确意图。
排序详解
ls 默认按当前 locale 的字母顺序排序。可组合多个排序逻辑:
bash
# 先按扩展名排,扩展名相同的按大小排(后者会覆盖前者——ls 只支持单排序键)
ls -l --sort=extension
# 反向:最老的在前
ls -ltr
# 不排序:目录原始顺序(最快,适合海量文件)
ls -f
# 等同:ls -aU颜色体系
GNU ls 的彩色输出由 LS_COLORS 环境变量控制,通过 dircolors 命令生成。
默认颜色含义
| 文件类型 | 默认颜色 | 含义 |
|---|---|---|
| 目录 | 蓝色粗体 | — |
| 符号链接 | 青色 | — |
| 可执行文件 | 绿色粗体 | — |
| 套接字 | 品红色 | — |
| 管道(FIFO) | 黄色(黑底) | — |
| 块设备 | 黄色(黑底粗体) | — |
| 字符设备 | 黄色(黑底) | — |
| 断开的符号链接 | 红色粗体(黑底闪烁) | 目标不存在 |
| 无此文件的符号链接 | 红色粗体(黑底闪烁) | 同上 |
| 归档文件(.tar/.gz/.zip 等) | 红色 | — |
自定义颜色
bash
# 查看当前 LS_COLORS 设置
echo $LS_COLORS
# 生成默认配置
dircolors -p > ~/.dircolors
# 编辑 .dircolors 后启用
eval $(dircolors ~/.dircolors)
# 简单示例:将 .md 文件设为黄色
# 在 .dircolors 中添加:
# .md 01;33对比与迁移
ls vs find vs tree vs stat
| 场景 | 用哪个 | 为什么 |
|---|---|---|
| 列出目录内容(人看) | ls -lh | 人类可读、彩色、按名排序 |
| 搜索文件(按名称/大小/时间) | find | find 能做递归过滤、谓词组合、执行操作;ls 的 --hide 只是简单隐藏 |
| 可视化目录树 | tree | ls -R 输出扁平、难读;tree 有缩进结构 |
| 查看单个文件完整元数据 | stat | 显示所有时间戳、设备号、inode 等 |
| 脚本中处理文件列表 | `find -print0 | xargs -0` |
ls 不负责的事情:
- × 搜索文件(用
find) - × 文件内容查看(用
cat/less) - × 磁盘占用分析(用
du) - × 脚本文件迭代(用
find或 shell glob) - × 通配符过滤——
ls *.log的通配符展开是 shell 做的,不是ls
GNU vs BSD(macOS)差异
| 功能 | GNU ls | macOS(BSD)ls |
|---|---|---|
| 彩色输出 | --color=auto | -G(无 --color 长选项) |
| 人类可读大小 | -h | -h ✅ 相同 |
| 完整时间 | --full-time | -lT(-T = 完整时间) |
| 不显示组 | -G / --no-group | -o(不显示组) |
| 不显示所有者 | -g | -g ✅ 相同 |
| 目录排前 | --group-directories-first | ❌ 不支持 |
| 自然排序 | -v / --sort=version | ❌ 不支持 |
--time=birth | ✅ | -lU(-U 显示创建时间) |
| NUL 分隔 | --zero | ❌ 不支持 |
macOS 用户可 brew install coreutils 后使用 gls 获得 GNU 行为。
常见误区
| ❌ 误区 | ✅ 事实 |
|---|---|
ls -a 显示的 . .. 是隐藏文件 | . 和 .. 是目录硬链接自身,ls -A 不显示它们 |
ls *.log 靠 ls 来过滤 | 通配符是 shell 展开的,跟 ls 无关。文件多到报 Argument list too long 时用 find |
ls -l 的大小 = 磁盘占用 | 那是文件字节数。看磁盘占用用 du |
ls -l 的字段含义不用学 | 不会读 10 个字段就看不懂权限问题,s/t 位是常见安全排查点 |
用 ls 输出给脚本解析 | 文件名可含换行符、空格。用 find -print0 或 shell glob 替代 |
ls -R 等于 tree | ls -R 输出扁平无缩进,百级目录无法阅读 |
所有系统 ls 行为一样 | GNU ls 与 BSD ls 在排序选项、--color 等处不同 |
退出状态码
| 值 | 含义 |
|---|---|
0 | 成功 |
1 | 小问题(如无法访问某子目录) |
2 | 严重错误(如无法访问命令行参数指定的路径) |
注意事项
ls输出到终端时默认按列排列(-C),输出到管道时默认每行一个(-1),这是自动行为- 脚本中避免解析
ls输出——用find、shell glob 或stat获取文件列表 ls -l显示的文件大小对稀疏文件(sparse file)不准确——看磁盘占用用du-h和-k可共存,-h更常用--hide和-I的区别非常细微:--hide是默认行为中的隐藏,-I是更严格的忽略。实际使用基本等价- BSD
ls(macOS)的-G是彩色输出,而 GNUls的-G是"不显示组名"——两者完全不同
来源
| 来源 | 链接 |
|---|---|
GNU coreutils ls 手册 | https://man7.org/linux/man-pages/man1/ls.1.html |
| GNU coreutils 官方文档 | https://www.gnu.org/software/coreutils/manual/html_node/ls-invocation.html |
dircolors 手册 | https://man7.org/linux/man-pages/man1/dircolors.1.html |
