下面我将分步解析 stat 命令的输出结果,并提供不同系统(GNU/Linux 和 macOS)下的示例和区别。

核心概念:stat 显示什么?
stat 命令主要显示以下几类信息:
- 文件类型: 是普通文件、目录、符号链接、设备文件等。
- 权限: 文件的读、写、执行权限,以及所有者、所属组信息。
- inode 信息: 文件的唯一标识号、链接数、硬链接指向的 inode 等。
- 时间戳:
- Access Time (atime): 最后一次访问文件的时间(读取内容)。
- Modify Time (mtime): 最后一次修改文件内容的时间(写入数据)。
- Change Time (ctime): 最后一次改变文件状态(如权限、所有者)或内容的时间。
- 大小信息: 文件的大小(以字节为单位)。
- 块信息: 文件占用的磁盘块数,以及每个块的大小。
- 设备信息: 文件所在的设备号(主设备号和次设备号)。
GNU/Linux (Ubuntu, CentOS) 下的 stat 输出解析
这是最常见的 stat 命令版本,功能非常全面。
示例文件
我们先创建一个用于测试的文件 testfile.txt:
echo "Hello, stat command!" > testfile.txt touch -m -d "2025-10-27 10:30:00" testfile.txt
执行命令
stat testfile.txt
输出结果及逐行解析
File: testfile.txt # 文件名 Size: 22 # 文件大小(字节) Blocks: 8 IO Block: 4096 # 文件占用的磁盘块数 和 每个块的大小(通常是 4096 字节) Device: 801h/2049d Inode: 131075 # 设备号 (十六进制/十进制) 和 Inode 号 Links: 1 # 硬链接的数量 Access: (0644/-rw-r--r--) Uid: ( 1000/ myuser) Gid: ( 1000/ myuser) # 文件权限 (八进制/符号表示) 和 所有者/所属组 Access: 2025-10-27 10:30:00.000000000 +0800 # atime: 最后访问时间 Modify: 2025-10-27 10:30:00.000000000 +0800 # mtime: 最后修改时间 Change: 2025-10-27 10:30:00.000000000 +0800 # ctime: 最后状态改变时间 Birth: - # Birth/Creation time: 创建时间(需要特定文件系统支持,如 ext4)
关键点详解
-
Blocks和IO Block:
(图片来源网络,侵删)Blocks: 文件实际占用的磁盘块数,即使文件很小(如 1 字节),通常也会占用至少一个块(IO Block的大小)。Blocks乘以IO Block的值通常会大于或等于Size。IO Block: 文件系统 I/O 操作的基本单位,在现代 Linux 系统上,这通常是 4096 字节(4KB)。
-
Device和Inode:Device: 唯一标识文件所在的硬盘分区或设备。Inode: 文件系统中的索引节点号,它是文件在文件系统中的唯一标识。两个文件名可以指向同一个 Inode,这就是硬链接。
-
Links:- 硬链接的数量,如果一个文件有 2 个硬链接,
Links2,当Links大于 1 时,删除任何一个文件名都不会真正删除文件数据,直到所有链接都被删除。
- 硬链接的数量,如果一个文件有 2 个硬链接,
-
Access,Modify,Change时间戳:- Access Time (atime): 当你用
cat,less,vim等命令读取文件内容时,atime会更新,但现代系统为了性能,可能会延迟更新。 - Modify Time (mtime): 当你用
echo,vim,echo >>等命令修改文件内容时,mtime会更新,这是最常用的时间戳。 - Change Time (ctime): 当你修改文件的元数据时,
ctime会更新。chmod,chown,mv(在同一设备下移动文件,内容不变但路径变了,也算元数据改变),如果文件内容被修改,ctime也会跟着更新,因为内容也是元数据的一部分。 - Birth/Creation Time: 文件的创建时间,并非所有文件系统都支持记录这个时间(如 ext4 需要特定选项启用),如果系统不支持,这里会显示 。
- Access Time (atime): 当你用
macOS 下的 stat 输出解析
macOS 自带的 stat 命令(来自 BSD)与 GNU 版本在输出格式和功能上有所不同。

示例文件
echo "Hello, stat command!" > testfile.txt touch -m -t 202510271030 testfile.txt
执行命令
stat testfile.txt
输出结果及逐行解析
16777222 6553535 -rw-r--r-- 1 myuser staff 0 22 "Oct 27 10:30:00 2025" "Oct 27 10:30:00 2025" "Oct 27 10:30:00 2025" "Oct 27 10:30:00 2025" 80 8 4294967296 1 testfile.txt # ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # 1. 文件系统状态标志 # 2. 设备号 # 3. 文件权限 (符号表示) # 4. 硬链接数 # 5. 所有者 # 6. 所属组 # 7. 设备类型 (如果是块设备或字符设备) # 8. 文件大小 (字节) # 9. 最后访问时间 (atime) # 10. 最后修改时间 (mtime) # 11. 最后状态改变时间 (ctime) # 12. 创建时间 (birth/creation time) - macOS 默认提供 # 13. 文件占用的磁盘块数 # 14. 文件系统的块大小 # 15. 文件系统标识 # 16. Inode 号 # 17. 文件名
与 GNU stat 的主要区别
- 输出格式: macOS
stat是单行输出,所有信息用空格分隔,更像一个脚本工具,GNUstat是多行、易读的格式化输出。 - 功能选项: GNU
stat提供了丰富的-c(custom) 和-f(file system) 选项,可以精确控制输出内容,macOSstat的选项相对较少。 - 创建时间: macOS 的 HFS+ 和 APFS 文件系统原生支持记录创建时间,
stat默认会显示它,这是 macOSstat的一个优势。
常用 stat 命令选项
| 选项 (GNU) | 选项 (macOS) | 描述 |
|---|---|---|
-c |
无 | 使用自定义格式输出。非常常用! |
-f |
无 | 显示文件系统状态,而不是文件状态。 |
-L |
-l |
遵循符号链接,显示链接指向的文件的信息,而不是链接本身。 |
-t |
无 | 以简洁的单行格式输出,类似 macOS 的默认格式。 |
stat -c (自定义格式) 示例 (仅限 GNU/Linux)
这是 stat 最强大的功能之一,可以提取特定信息用于脚本。
# 只显示文件名和大小 stat -c "%n %s" testfile.txt # 输出: testfile.txt 22 # 显示所有者、权限和最后修改时间 stat -c "%U %A %y" testfile.txt # 输出: myuser -rw-r--r-- 2025-10-27 10:30:00 # 显示 Inode 号 stat -c "%i" testfile.txt # 输出: 131075
常用格式占位符:
%n: File name%s: Size in bytes%A: Permissions (symbolic)%a: Permissions (octal)%u: User ID%U: User name%g: Group ID%G: Group name%t: Major device number (hex)%T: Minor device number (hex)%i: Inode number%Y: Time of last modification (seconds since epoch)%y: Time of last modification (human-readable)%X: Time of last access (seconds since epoch)%x: Time of last access (human-readable)%Z: Time of last status change (seconds since epoch)%z: Time of last status change (human-readable)
| 特性 | GNU/Linux stat |
macOS stat |
|---|---|---|
| 默认输出 | 多行,可读性强,格式化 | 单行,紧凑,适合脚本 |
| 创建时间 | 通常不显示(除非 -f 或特定文件系统) |
默认显示 |
| 自定义格式 | 强大的 -c 选项 |
不支持 |
| 查看文件系统 | 强大的 -f 选项 |
不支持 |
| 脚本友好 | -t 选项可输出单行 |
默认就是单行,天生友好 |
如何判断你的系统是哪个版本?
stat --version # 如果显示 GNU coreutils 版本,则是 GNU 版 stat -V # macOS 下会显示 stat 的版本信息
stat 是一个比 ls -l 更底层、更详细的文件信息查看工具,当你需要精确地获取文件的元数据、inode 信息或进行复杂的脚本处理时,stat 是不二之选。
