菜鸟科技网

stat命令结果如何解读?

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

stat命令结果如何解读?-图1
(图片来源网络,侵删)

核心概念:stat 显示什么?

stat 命令主要显示以下几类信息:

  1. 文件类型: 是普通文件、目录、符号链接、设备文件等。
  2. 权限: 文件的读、写、执行权限,以及所有者、所属组信息。
  3. inode 信息: 文件的唯一标识号、链接数、硬链接指向的 inode 等。
  4. 时间戳:
    • Access Time (atime): 最后一次访问文件的时间(读取内容)。
    • Modify Time (mtime): 最后一次修改文件内容的时间(写入数据)。
    • Change Time (ctime): 最后一次改变文件状态(如权限、所有者)或内容的时间。
  5. 大小信息: 文件的大小(以字节为单位)。
  6. 块信息: 文件占用的磁盘块数,以及每个块的大小。
  7. 设备信息: 文件所在的设备号(主设备号和次设备号)。

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)

关键点详解

  • BlocksIO Block:

    stat命令结果如何解读?-图2
    (图片来源网络,侵删)
    • Blocks: 文件实际占用的磁盘块数,即使文件很小(如 1 字节),通常也会占用至少一个块(IO Block 的大小)。Blocks 乘以 IO Block 的值通常会大于或等于 Size
    • IO Block: 文件系统 I/O 操作的基本单位,在现代 Linux 系统上,这通常是 4096 字节(4KB)。
  • DeviceInode:

    • Device: 唯一标识文件所在的硬盘分区或设备。
    • Inode: 文件系统中的索引节点号,它是文件在文件系统中的唯一标识。两个文件名可以指向同一个 Inode,这就是硬链接
  • Links:

    • 硬链接的数量,如果一个文件有 2 个硬链接,Links 2,当 Links 大于 1 时,删除任何一个文件名都不会真正删除文件数据,直到所有链接都被删除。
  • 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 需要特定选项启用),如果系统不支持,这里会显示 。

macOS 下的 stat 输出解析

macOS 自带的 stat 命令(来自 BSD)与 GNU 版本在输出格式和功能上有所不同。

stat命令结果如何解读?-图3
(图片来源网络,侵删)

示例文件

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 的主要区别

  1. 输出格式: macOS stat 是单行输出,所有信息用空格分隔,更像一个脚本工具,GNU stat 是多行、易读的格式化输出。
  2. 功能选项: GNU stat 提供了丰富的 -c (custom) 和 -f (file system) 选项,可以精确控制输出内容,macOS stat 的选项相对较少。
  3. 创建时间: macOS 的 HFS+ 和 APFS 文件系统原生支持记录创建时间,stat 默认会显示它,这是 macOS stat 的一个优势。

常用 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 是不二之选。

分享:
扫描分享到社交APP
上一篇
下一篇