Linux命令-stat(显示文件/文件系统状态)
Linux命令-stat(显示文件/文件系统状态)
- 快速参考
- 基本用法(文件状态)
- 自定义格式输出(-c)
- 常用格式说明符
- 文件系统状态(-f)
- 实用脚本示例
- stat vs ls -l
stat用于显示文件或文件系统的详细元数据信息。与ls -l相比,stat提供了更精确的时间戳(纳秒级)、inode 号、块数、文件系统 ID 等深层信息。在脚本中,stat -c的自定义格式功能使其成为获取文件属性的首选工具。
快速参考
stat[选项]文件...stat-f[选项]文件...
stat直接调用stat()/lstat()系统调用获取信息。纳秒精度的时间戳是其区别于ls的重要特征。
基本用法(文件状态)
# 查看文件完整状态statfile.txt# 示例输出解析:# File: file.txt# Size: 1234 Blocks: 8 IO Block: 4096 regular file# Device: 801h/2049d Inode: 123456 Links: 1# Access: (0644/-rw-r--r--) Uid: ( 1000/ user) Gid: ( 1000/ user)# Access: 2024-01-15 10:30:45.123456789 +0800# Modify: 2024-01-14 15:20:30.987654321 +0800# Change: 2024-01-14 15:20:30.987654321 +0800# Birth: -# 查看多个文件statfile1.txt file2.txt file3.txt# 跟随符号链接(默认行为)stat/usr/bin/python# 不跟随符号链接(查看符号链接自身)stat-L/etc/resolv.conf自定义格式输出(-c)
# 仅显示文件大小stat-c"%s"file.txt# 仅显示文件名和大小stat-c"%n: %s bytes"file.txt# 显示权限(八进制)stat-c"%a"file.txt# 644# 显示完整权限字符串stat-c"%A"file.txt# -rw-r--r--# 显示用户名和组名stat-c"Owner: %U Group: %G"file.txt# 时间戳(Unix 时间戳)stat-c"Access: %X Modify: %Y Change: %Z"file.txt# 时间和文件名stat-c"%n 修改时间: %y"*.txt# 显示 inode 号stat-c"inode: %i"file.txt# 显示设备号stat-c"Device: %d"file.txt# 显示块数和块大小stat-c"Blocks: %b (Block Size: %o)"file.txt# 显示文件类型stat-c"%F"file.txt# 显示纳秒精度修改时间stat-c"%n %.Y"file.txt常用格式说明符
| 格式符 | 含义 | 示例输出 |
|---|---|---|
%n | 文件名 | file.txt |
%s | 文件大小(字节) | 12345 |
%a | 八进制权限 | 644 |
%A | 人类可读权限 | -rw-r–r– |
%U | 所有者用户名 | root |
%G | 所属组名 | wheel |
%i | inode 号 | 123456 |
%h | 硬链接数 | 1 |
%X | 最后访问时间(Unix 时间戳) | 1609459200 |
%Y | 最后修改时间(Unix 时间戳) | 1609459200 |
%Z | 最后状态变更时间 | 1609459200 |
%x | 最后访问时间(人类可读) | 2024-01-15 |
%y | 最后修改时间(人类可读) | 2024-01-14 |
%z | 最后状态变更时间(人类可读) | 2024-01-14 |
%F | 文件类型 | regular file |
%d | 设备号(十进制) | 2049 |
文件系统状态(-f)
# 查看文件系统信息stat-f/# 输出含义:# File: "/"# ID: ab12cd34ef567890 Namelen: 255 Type: ext2/ext3# Block size: 4096 Fundamental block size: 4096# Blocks: Total: 25600000 Free: 12800000 Available: 12000000# Inodes: Total: 6553600 Free: 6000000# 查看挂载点文件系统stat-f/homestat-f/mnt/usb# 自定义文件系统格式输出stat-f-c"类型: %T 可用: %a blocks"/stat-f-c"总计: %b Block 空闲: %f Block"/实用脚本示例
# 查找最近 24 小时内修改的文件find.-typef-newermt"24 hours ago"-execstat-c"%n %y"{}\;# 比较两个文件的时间戳compare_timestamps(){localmod1=$(stat-c"%Y""$1")localmod2=$(stat-c"%Y""$2")if["$mod1"-gt"$mod2"];thenecho"$1较新 ($(date-d@$mod1))"elseecho"$2较新 ($(date-d@$mod2))"fi}compare_timestamps file_a.txt file_b.txt# 批量显示目录内文件大小排行find.-typef-execstat-c"%s %n"{}\;|sort-rn|head-20# 检查文件权限是否正确check_perms(){localexpected="$1"file="$2"localactual=$(stat-c"%a""$file")if["$actual"!="$expected"];thenecho"⚠️$file权限为$actual(期望$expected)"return1fireturn0}check_perms600~/.ssh/id_ed25519# 磁盘使用预警脚本USAGE=$(stat-f-c"100 - 100 * %a / %b"/home|bc)if["$USAGE"-gt90];thenecho"⚠️ 磁盘使用率:${USAGE}%"fistat vs ls -l
| 特性 | stat | ls -l |
|---|---|---|
| 纳秒时间戳 | 支持 | 不支持 |
| Inode 号 | 直接显示 | ls -i |
| 块信息 | 详细 | 不显示 |
| 设备号 | 直接显示 | 不显示 |
| 自定义格式 | 强大(-c) | 有限 |
| 文件系统信息 | 支持(-f) | 不支持 |
| 一眼可读性 | 信息量大 | 更直观 |
# 功能对比ls-lfile.txt -rw-r--r--1user user1234Jan1510:30 file.txtstatfile.txt# 提供了 inode、block、三个时间戳、链接数、设备号等# 比 ls -l 多出约 3 倍的元数据信息# 获取特定信息ls-lfile.txt|awk'{print $5}'# 大小(方式一)stat-c"%s"file.txt# 大小(方式二,更清晰)ls-ifile.txt# inode(方式一)stat-c"%i"file.txt# inode(方式二,脚本友好)脚本建议:在编写需要文件元数据的 Shell 脚本时,优先使用
stat -c而非解析ls输出。stat的格式稳定可预测,不依赖人类可读格式的解析。