ls[1] 程序用于列出文件(包括目录)的信息。选项和文件参数可以按任意顺序混合使用,这是其常见特性。如果选项之间存在冲突,后出现的选项会覆盖先前的。
ls [OPTION]... [FILE]...
基本行为
目录参数:默认情况下,ls 会列出指定目录中的内容(非递归),并且忽略名称以点(.)开头的文件。
# 列出 work 目录$ ls workt.py tempCodeRunnerFile.py vim
$ ls work/t.pywork/t.py
无参数时:如果没有指定任何非选项参数,ls 会操作当前目录,其行为等同于使用一个参数 .。
$ lst.py tempCodeRunnerFile.py vim# 等同于$ ls .t.py tempCodeRunnerFile.py vim
默认排序与输出格式
# 准备测试文件touch file{1..6}.txt
排序:默认情况下,ls 会根据当前生效的区域设置,按字母顺序列出每个目录的内容。
如果标准输出连接到一个终端,输出会以列的形式显示(垂直排序),并且控制字符会安全地显示为问号(?)。
$ lsfile1.txt file4.txt t.pyfile2.txt file5.txt tempCodeRunnerFile.pyfile3.txt file6.txt vim
- 如果标准输出
不是终端,输出会每行一项,并且控制字符会原样输出。
$ ls > ls_output.txt$ cat ls_output.txtfile1.txtfile2.txtfile3.txtfile4.txtfile5.txtfile6.txtls_output.txtt.pytempCodeRunnerFile.pyvim
退出状态
1. 列出哪些文件
这些选项决定了 ls 会显示哪些文件的信息。
| | |
|---|
-a | --all | |
-A | --almost-all | 列出几乎所有文件,但仍忽略当前目录(.)和父目录(..)。注意:-a 选项会覆盖此选项。 |
-B | --ignore-backups | 忽略以波浪符(~)结尾的备份文件。等价于 --ignore='*~' --ignore='.*~'。 |
-d | --directory | 将目录本身视为普通文件列出,而不是列出其内容。除非指定了 -H、-L 或 --dereference-command-line-symlink-to-dir 选项,否则不会解引用命令行中列出的符号链接。 |
-H | --dereference-command-line | 如果命令行参数指定了一个符号链接,则显示该链接指向的文件的信息,而不是链接本身的信息。 |
| --dereference-command-line-symlink-to-dir | 通常不解引用符号链接,但有一个例外:如果命令行参数指定了一个指向目录的符号链接,则显示该目录的信息。这是默认行为,除非使用了长格式或以下任一选项生效:-F、-d、-L 或 -H。 |
| --hide=模式 | 在目录中,忽略名称匹配指定 shell 模式的文件,除非同时给出了 -a 或 -A 选项。此选项类似于 --ignore,但当 -a 或 -A 生效时,此选项无效。 |
-I 模式 | --ignore=模式 | 在目录中,忽略名称匹配指定 shell 模式(不是正则表达式)的文件。类似于 shell 通配符,文件名开头的点(.)不匹配模式开头的通配符。可以多次使用此选项来忽略多种模式。 |
-L | --dereference | 显示符号链接信息时,显示链接指向的文件的信息,而不是链接本身的信息。但,ls 仍会打印链接本身的名称,而不是其指向的文件名。 |
-R | --recursive | |
示例:
$ ls --ignore='.??*' --ignore='.[^.]' --ignore='#*'- 第一个
--ignore 忽略以 . 开头且长度大于等于 3 的文件名。 - 第二个
--ignore 忽略以 . 开头的所有两字符文件名,除了 ..。 - 第三个
--ignore 忽略以 # 开头的文件名。
2. 列出哪些信息
这些选项影响 ls 显示的信息。默认情况下,只显示文件名。
| | |
|---|
| --author | 在长格式输出中,列出每个文件的作者(在 GNU/Hurd 系统中,文件作者可能与所有者不同)。 |
-D | --dired | 在主输出后,额外打印专用于 Emacs 编辑器的格式行,记录每个文件名在输出中的字节位置,方便 Emacs 准确定位。此选项隐含了长格式输出并禁用超链接。 |
| --full-time | 使用长格式输出,并列出完整的时间戳。等价于 -l --time-style=full-iso。 |
-g | | |
-G | --no-group | 在长格式输出中,抑制显示组信息。(这是某些非 GNU 版本 ls 的默认行为。) |
-h | --human-readable | 以人类可读格式显示文件大小(例如,K、M、G),使用 1024 为基数。M 表示 1,048,576 字节。等价于 --block-size=human-readable。如需使用 1000 为基数,请使用 --si 选项。 |
-i | --inode | 在每个文件名的左侧打印其 inode 号(索引节点号)。 |
-l | --format=long | 使用长格式输出详细信息。包括:文件类型、权限位、硬链接数、所有者、所属组、大小和时间戳(默认为修改时间 mtime)。对于特殊文件(块/字符设备),大小字段会被设备的主/次设备号替代。 |
-n | --numeric-uid-gid | 使用长格式输出,但显示数字形式的用户 ID 和组 ID,而不是用户名和组名。 |
-o | | 使用长格式输出,但省略组信息。等价于 -l -G。 |
-s | --size | 在每个文件名的左侧打印其文件系统分配大小(通常是 1024 字节的块数)。此大小可能因文件系统特性(如稀疏文件)而与其内容大小不同。 |
| --si | 以 SI 标准(国际单位制)显示文件大小(例如,k、M、G),使用 1000 为基数。M 表示 1,000,000 字节。等价于 --block-size=si。如需使用 1024 为基数,请使用 -h 选项。 |
-Z | --context | 显示 SELinux 安全上下文,如果未找到则显示 ?。在长格式中,安全上下文显示在大小列的左侧。 |
$ ls -ltotal 36-rw-r--r-- 1 root root 4136 Dec 10 16:47 ascii.sh-rw-r--r-- 1 root root 0 Jan 6 15:24 back~-rw-r--r-- 1 root root 1360 Dec 1 15:36 opts_parse.sh-rwxr-xr-x 1 root root 9257 Dec 10 13:29 printf.sh-rw-r--r-- 1 root root 628 Nov 23 21:12 return.sh-rw-r--r-- 1 root root 793 Nov 23 21:18 trap_debug.shdrwxr-xr-x 3 root root 4096 Dec 30 16:03 work-rw-r--r-- 1 root root 0 Oct 1 2023 xx.txtlrwxrwxrwx 1 root root 6 Jan 6 15:27 xx.txtt -> xx.txt
-l 选项的详细说明:
后续 9 列 - 权限位:rwxrwxrwx(所有者-组-其他用户)
s:设置了 set-user-ID 或 set-group-ID 位,且对应的可执行位也被设置。S:设置了 set-user-ID 或 set-group-ID 位,但对应的可执行位未设置。t:设置了 sticky 位 (t),且其他用户的可执行位也被设置。T:设置了 sticky 位 (t),但其他用户的可执行位未设置。
额外字符:权限位之后可能有一个额外字符,表示文件的替代访问方法(如 ACL):
.:具有安全上下文,但无其他替代访问方法(GNU ls 特有)。
3. 排序输出
这些选项改变 ls 输出目录中文件信息的顺序。默认按文件名根据 LC_COLLATE 区域设置进行字母排序。
| | |
|---|
-c | --time=ctime | 在长格式中,显示状态变更时间 (ctime) 而非修改时间。在按时间排序时,也根据 ctime 排序。 |
-f | | 不排序,并且列出所有文件(包括隐藏文件)。效果如同 -U -a 的组合。 |
| --group-directories-first | 列出目录时,优先分组显示子目录,然后再显示非目录文件,并对这两组分别进行排序。 |
-r | --reverse | 反转当前排序的顺序(例如,反向字母序、最旧优先、最大优先等)。当 -U 生效时,此选项无效。 |
-S | --sort=size | |
-t | --sort=time | 按修改时间 (mtime) 排序,最新的优先。可以使用 --time 选项更改排序依据的时间戳类型。 |
-u | --time=atime / --time=access / --time=use | 在长格式中,显示最后访问时间 (atime)。在按时间排序时,也根据 atime 排序。 |
| --time=mtime | 默认的时间戳显示和排序模式。在长格式中显示修改时间 (mtime)。 |
| --time=birth | 在长格式中,显示文件创建时间(如果可用),否则回退到修改时间 (mtime)。按时间排序时,根据创建时间排序。 |
-U | --sort=none | 不排序;按文件在目录中存储的原始顺序列出。在列出大型目录时,可以避免排序带来的性能开销。注意:与 -f 不同,此选项不隐含 -a。 |
-v | --sort=version | 按版本名称和编号进行自然排序(将数字序列按数值处理),版本号低的优先。 |
| --sort=name | 按文件名排序。这是 ls 的默认操作,可显式指定以覆盖先前设置的排序选项。 |
| --sort=width | 按文件名的打印宽度排序。与 -C 输出格式结合使用时,可使文件列表的显示最紧凑。 |
-X | --sort=extension | 按文件扩展名(最后一个点 . 之后的部分)的字母顺序排序;无扩展名的文件优先列出。 |
4. 通用输出格式
这些选项影响整体输出的外观。
| | |
|---|
| --format=single-column | 每行只列出一个文件名。这是当标准输出不是终端时 ls 的默认格式。 |
-1 | | 每行列出一个文件。类似于 --format=single-column,但如果长格式生效,此选项无效。 |
-C | --format=vertical | 以垂直排序的列形式列出文件。这是当标准输出是终端时 ls 的默认格式。GNU ls 使用可变宽度列来在尽可能少的行中显示最多的文件。 |
| --color[=when] | 指定是否使用颜色来区分文件类型。when 可以是:never(从不)、auto(仅当输出到终端时,默认)、always(总是)。使用 --color 而不指定 何时 等价于 --color=always。 |
-F | --classify[=when] / --indicator-style=classify | 在文件名后追加字符以指示文件类型。可执行文件后加 *。目录 /,符号链接 @,FIFO |,套接字 =。when 参数同--color。 |
| --file-type / --indicator-style=file-type | 在文件名后追加字符以指示文件类型。类似于 -F,但不标记可执行文件。 |
| --hyperlink[=when] | 输出一些终端支持的超链接代码,使用 file:// URI 格式链接到文件。when 参数同 --color。 |
| --indicator-style=style | 指定文件名后的指示符样式。style 可为:none(无)、slash(目录后加 /,同 -p)、file-type(同 --file-type)、classify(同 -F)。 |
-k | --kibibytes | 将默认块大小设置为 1024 字节,覆盖环境变量中的设置。但 --block-size、-h 或 --si 选项的优先级更高。此选项影响长格式输出的目录总块数和 -s 选项的输出,不影响文件字节大小。 |
-m | --format=commas | 以逗号加空格(,)分隔文件,水平列出,每行尽可能多地放置文件名。 |
-p | --indicator-style=slash | |
-x | --format=across | |
-T 列数 | --tabsize=列数 | 假设每个制表符(Tab)宽度为指定列数。默认是 8。设为 0 则完全不使用制表符。如果终端硬件制表位设置非默认,需配合此选项或 TABSIZE 环境变量。 |
-w 列数 | --width=列数 | 假设屏幕宽度为指定列数。默认取自终端设置,否则取自 COLUMNS 环境变量,否则为 80。设为 0 表示输出行长度无限制,并用空格而非制表符分隔。 |
| --zero | 在每行末尾输出零字节(ASCII NUL)而不是换行符。这使得其他程序即使面对包含换行符的文件名也能正确解析输出。此选项隐含 -1、--color=none 和 --quoting-style=literal,且与 -D 选项不兼容。 |
5. 格式化文件时间戳
默认情况下,文件时间戳以简略形式列出:非最近的文件使用类似 Mar 30 2025 的日期,最近的文件(6 个月内)使用类似 Mar 30 23:45 的日期和时间(不含年份)。具体格式受当前区域设置影响。
--time-style 样式详解:
+format:使用自定义的 format 字符串,语法同 date 命令。例如:--time-style="+%Y-%m-%d %H:%M:%S" 会输出 2025-12-10 16:47:18。如果格式字符串中包含换行符,则前一部分用于非最近文件,后一部分用于最近文件。full-iso:完整的 ISO 8601 风格,包含日期、时间(纳秒精度)和时区。例如:2025-12-10 16:47:18.955327007 +0800。等价于 +%Y-%m-%d %H:%M:%S.%N %z。long-iso:ISO 8601 风格,精确到分钟。例如:2025-12-10 16:47。等价于 +%Y-%m-%d %H:%M。iso:非最近文件用 ISO 8601 日期(如 2024-03-30),最近文件用月-日 时:分(如 03-30 23:45)。较为紧凑。locale:依赖于区域设置 (LC_TIME) 的格式。易于阅读,但格式不统一,不易解析。是默认样式。posix-style:当 LC_TIME 区域设置为 POSIX 时,使用 POSIX 区域格式,否则使用 样式 指定的格式。例如,posix-long-iso 在 POSIX 区域下输出 Mar 30 2025 和 Mar 30 23:45,否则输出 2025-03-30 23:45。
环境变量:可以使用 TIME_STYLE 环境变量设置 --time-style 的默认值。如果未设置,默认样式是 locale。
export TIME_STYLE="+%Y-%m-%d %H:%M:%S"
6. 格式化文件名
这些选项改变文件名本身的打印方式。
| | |
|---|
-b | --escape | 对文件名中的非图形字符使用类似 C 语言的字母和八进制反斜杠转义序列。 |
-N | --literal / --quoting-style=literal | 不引用文件名。但当输出到终端且未指定 --show-control-chars 时,非图形字符仍显示为问号。 |
-q | --hide-control-chars | 将文件名中的非图形字符打印为问号。如果输出是终端且程序是 ls,这是默认行为。 |
-Q | --quote-name | 用双引号包围文件名,并像 C 语言字符串那样转义非图形字符。 |
| --quoting-style=style | 使用指定的样式来引用文件名和其他可能包含任意字符的字符串。 |
--quoting-style 样式详解:
shell:如果字符串包含 shell 元字符或会导致歧义输出,则为 shell 引用。适用于 bash 等 POSIX 兼容 shell,但不总适用于 csh 等。shell-always:始终为 shell 引用字符串,即使通常不需要。shell-escape:类似于 shell,但使用 POSIX $'...' 语法引用非打印字符。这是输出到终端时的默认格式,因为它能明确、安全地表示任何文件名。结合 LC_ALL=C 使用可避免某些终端字符转换问题。shell-escape-always:类似于 shell-escape,但始终引用字符串。c:像 C 字符串字面量一样引用,包括外围双引号。同 -Q。c-maybe:像 C 字符串字面量一样引用,但如果不需要转义,则省略外围双引号。escape:像 C 字符串字面量一样引用,但省略外围双引号。同 -b。clocale:像 C 字符串字面量一样引用,但使用适合区域设置的外围引号。locale:像 C 字符串字面量一样引用,但使用适合区域设置的外围引号。在默认 C 区域设置中,使用单引号 'like this' 而非双引号,显示更美观。
| |
|---|
--show-control-chars | 将文件名中的非图形字符原样输出。除非输出是终端且程序是 ls,否则这是默认行为。 |
环境变量:可以使用 QUOTING_STYLE 环境变量设置 --quoting-style 的默认值。如果未设置,当输出是终端时,默认值是 shell-escape,否则是 literal。
参考资料
[1] ls: https://www.gnu.org/software/coreutils/manual/html_node/ls-invocation.html