三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Linux命令-stat(显示文件/文件系统状态)

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
%iinode 号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}%"fi

stat vs ls -l

特性statls -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的格式稳定可预测,不依赖人类可读格式的解析。

← 返回列表