stat命令能查访问时间(atime)、修改时间(mtime)、状态变更时间(ctime)、inode号、硬链接数、设备号、八进制及符号权限、文件类型等ls -l不显示的底层元数据,其中ctime是元数据最后变更时间而非创建时间。

stat 命令能查哪些元数据
stat 显示的不只是修改时间或文件大小,它把 inode 层面的原始信息直接暴露出来:访问时间(atime)、修改时间(mtime)、状态变更时间(ctime)、inode 号、硬链接数、设备号、访问权限的八进制和符号表示、文件类型(普通文件/目录/符号链接等)。这些是 ls -l 不会显示的底层字段,比如 ctime 并非“创建时间”,而是文件元数据(如权限、所有者)最后一次被修改的时间——这点常被误解。
常用 stat 调用方式与格式控制
直接运行 stat filename 会输出两块信息:文件本身和文件系统(如所在磁盘)的统计。多数时候你只关心前者,可用 -c 自定义输出:
-
stat -c "%n %a %F %i %h" file.txt—— 分别输出文件名、八进制权限、类型、inode 号、硬链接数 -
stat -c "%y %x %z" file.txt—— 输出mtime、atime、ctime(带纳秒精度,默认格式为YYYY-MM-DD HH:MM:SS.NNNNNNNNN) -
stat -f /home—— 查看文件系统层面信息,如总块数、可用块数、块大小
注意:%y 是 mtime,不是“年份”;%y 和 %x 的输出格式受 locale 影响,若需固定 ISO 格式,加 --printf 或用 date -d "@$(stat -c '%Y' file)" 转换。
stat 和 ls -l 时间字段对不上怎么办
这是最常被卡住的地方。现象:用 ls -l 看到的时间和 stat 输出的 %y(mtime)不一致,甚至 ls -l 显示的是 atime 或 ctime?原因在于:
-
ls -l默认显示mtime,但加-u参数就显示atime,加-c就显示ctime - 某些文件系统(如 ext4)启用了
relatime挂载选项,导致atime不随每次读取更新,所以stat里atime可能远早于你刚cat过它的时间 -
ls -l对“最近时间”的缩写策略:如果mtime在今年内,只显示月日时分;如果更早,显示年份——而stat总是输出完整时间戳
stat 查不到符号链接指向的目标文件信息
默认情况下,stat symlink_name 显示的是符号链接自身的元数据(比如它自己的 mtime、大小为路径字符串长度),不是它指向的文件。要查目标文件,必须加 -L 参数:
-
stat mylink→ 显示符号链接文件本身的 inode、权限、大小(例如 12 字节) -
stat -L mylink→ 显示mylink所指向的真实文件的元数据 - 若链接损坏(目标不存在),
stat -L会报错:No such file or directory,而普通stat仍能成功
这个行为和 ls -l 类似,但 ls -l 默认就解析链接,stat 默认不解析——这点反直觉,容易漏掉 -L 就去排查“为什么 size 是 7”。


















