Skip to content

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/GIDls -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 -lhA

ls -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人类可读、彩色、按名排序
搜索文件(按名称/大小/时间)findfind 能做递归过滤、谓词组合、执行操作;ls--hide 只是简单隐藏
可视化目录树treels -R 输出扁平、难读;tree 有缩进结构
查看单个文件完整元数据stat显示所有时间戳、设备号、inode 等
脚本中处理文件列表`find -print0xargs -0`

ls 不负责的事情

  • × 搜索文件(用 find
  • × 文件内容查看(用 cat/less
  • × 磁盘占用分析(用 du
  • × 脚本文件迭代(用 find 或 shell glob)
  • × 通配符过滤——ls *.log 的通配符展开是 shell 做的,不是 ls

GNU vs BSD(macOS)差异

功能GNU lsmacOS(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 *.logls 来过滤通配符是 shell 展开的,跟 ls 无关。文件多到报 Argument list too long 时用 find
ls -l 的大小 = 磁盘占用那是文件字节数。看磁盘占用用 du
ls -l 的字段含义不用学不会读 10 个字段就看不懂权限问题,s/t 位是常见安全排查点
ls 输出给脚本解析文件名可含换行符、空格。用 find -print0 或 shell glob 替代
ls -R 等于 treels -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 是彩色输出,而 GNU ls-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