stat 命令 #
stat
命令用于显示文件或文件系统的详细状态信息,包括文件大小、权限、所有者、访问/修改/更改时间、inode信息等。它提供了比ls -l
更详细的文件信息。
语法 #
stat [选项] [文件...]
常用选项 #
选项 | 描述 |
---|---|
-f, --file-system |
显示文件系统状态而不是文件状态 |
-L, --dereference |
跟随符号链接 |
-c, --format=FORMAT |
使用指定格式输出,而不是默认格式 |
--printf=FORMAT |
类似于--format ,但解释反斜杠转义,且不输出强制性的尾随换行符 |
-t, --terse |
以简洁模式打印信息 |
--help |
显示帮助信息 |
--version |
显示版本信息 |
格式说明符 #
使用-c
或--printf
选项时,可以使用以下格式说明符:
文件格式说明符 #
说明符 | 描述 |
---|---|
%a |
八进制权限 |
%A |
人类可读的权限 |
%b |
已分配的块数 |
%B |
每个块的大小(以字节为单位) |
%d |
设备编号(十进制) |
%D |
设备编号(十六进制) |
%f |
原始模式(十六进制) |
%F |
文件类型 |
%g |
所有者的组ID |
%G |
所有者的组名 |
%h |
硬链接数 |
%i |
inode号 |
%m |
挂载点 |
%n |
文件名 |
%N |
带引号的文件名,如果是符号链接则解引用 |
%o |
最佳I/O传输大小 |
%s |
总大小(以字节为单位) |
%t |
主设备类型(十六进制) |
%T |
次设备类型(十六进制) |
%u |
所有者的用户ID |
%U |
所有者的用户名 |
%w |
文件创建时间(人类可读) |
%W |
文件创建时间(自纪元以来的秒数) |
%x |
最后访问时间(人类可读) |
%X |
最后访问时间(自纪元以来的秒数) |
%y |
最后修改时间(人类可读) |
%Y |
最后修改时间(自纪元以来的秒数) |
%z |
最后状态更改时间(人类可读) |
%Z |
最后状态更改时间(自纪元以来的秒数) |
文件系统格式说明符 #
说明符 | 描述 |
---|---|
%a |
非超级用户可用的空闲块 |
%b |
文件系统中的总数据块 |
%c |
文件系统中的总文件节点 |
%d |
文件系统中的空闲文件节点 |
%f |
文件系统中的空闲块 |
%i |
文件系统ID(十六进制) |
%l |
最大文件名长度 |
%n |
文件名 |
%s |
块大小(用于更快的传输) |
%S |
基本块大小(用于块计数) |
%t |
文件系统类型(十六进制) |
%T |
人类可读的文件系统类型 |
常见用法 #
1. 显示文件的详细信息 #
stat filename.txt
输出示例:
File: filename.txt
Size: 1234 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 1234567 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ user) Gid: ( 1000/ user)
Access: 2023-07-19 10:30:00.000000000 +0200
Modify: 2023-07-19 10:25:00.000000000 +0200
Change: 2023-07-19 10:25:00.000000000 +0200
Birth: 2023-07-19 10:20:00.000000000 +0200
2. 显示文件系统信息 #
stat -f /home
输出示例:
File: "/home"
ID: 1234abcd5678efgh Namelen: 255 Type: ext4
Block size: 4096 Fundamental block size: 4096
Blocks: Total: 12345678 Free: 9876543 Available: 9876543
Inodes: Total: 1234567 Free: 1234000
3. 使用自定义格式 #
stat -c "文件: %n, 大小: %s 字节, 权限: %A, 所有者: %U" filename.txt
输出示例:
文件: filename.txt, 大小: 1234 字节, 权限: -rw-r--r--, 所有者: user
4. 显示多个文件的信息 #
stat file1.txt file2.txt file3.txt
5. 显示符号链接的目标信息 #
stat -L symlink.txt
这将显示符号链接指向的文件的信息,而不是链接本身。
6. 以简洁模式显示信息 #
stat -t filename.txt
输出示例:
filename.txt 1234 8 81a4 1000 1000 801 1234567 1 0 0 1689756600 1689756300 1689756300 1689756000
7. 只显示特定信息 #
stat -c "%s" filename.txt # 只显示文件大小
stat -c "%U:%G" filename.txt # 显示所有者和组
8. 显示文件的时间信息 #
stat -c "访问时间: %x, 修改时间: %y, 更改时间: %z" filename.txt
实用示例 #
1. 查找最近修改的文件 #
find . -type f -exec stat -c "%Y %n" {} \; | sort -nr | head -n 10
这将显示当前目录及其子目录中最近修改的10个文件。
2. 比较两个文件的修改时间 #
if [ $(stat -c %Y file1.txt) -gt $(stat -c %Y file2.txt) ]; then
echo "file1.txt 比 file2.txt 更新"
else
echo "file2.txt 比 file1.txt 更新或相同"
fi
3. 查找大文件 #
find . -type f -exec stat -c "%s %n" {} \; | sort -nr | head -n 10
这将显示当前目录及其子目录中最大的10个文件。
4. 检查文件权限 #
if [ "$(stat -c %a filename.txt)" = "644" ]; then
echo "文件权限正确"
else
echo "文件权限不正确"
fi
5. 显示文件系统使用情况 #
stat -f -c "文件系统: %T, 总块数: %b, 可用块数: %a, 可用空间: %a*%S 字节" /
6. 检查文件是否为符号链接 #
if [ "$(stat -c %F filename)" = "symbolic link" ]; then
echo "这是一个符号链接"
else
echo "这不是一个符号链接"
fi
7. 监控文件更改 #
old_time=$(stat -c %Y filename.txt)
while true; do
new_time=$(stat -c %Y filename.txt)
if [ "$old_time" != "$new_time" ]; then
echo "文件已更改"
old_time=$new_time
fi
sleep 1
done
与其他命令的比较 #
命令 | 功能 | 区别 |
---|---|---|
stat |
显示详细的文件或文件系统状态 | 提供最全面的信息 |
ls -l |
列出文件的基本信息 | 信息较少,但更简洁 |
file |
确定文件类型 | 专注于文件类型识别 |
du |
显示文件或目录的磁盘使用情况 | 专注于磁盘使用量 |
df |
显示文件系统的磁盘空间使用情况 | 专注于文件系统级别的信息 |
提示 #
- 使用
stat
命令可以获取文件的详细元数据,这在脚本中特别有用 - 使用
-c
选项可以自定义输出格式,便于在脚本中处理 - 对于符号链接,默认显示链接本身的信息,使用
-L
选项可以显示链接目标的信息 - 在脚本中使用
stat
时,使用数值格式(如%Y
而不是%y
)更容易进行比较和计算 - 使用
-f
选项可以查看文件系统的详细信息,包括总容量、可用空间等 - 在处理大量文件时,可以结合
find
命令使用stat
来批量获取文件信息