stat 命令用于显示文件或文件系统的详细状态信息。它提供了比 ls -l 更全面的文件元数据信息,包括文件大小、权限、inode号、链接数、设备号、时间戳等。
stat [选项]... 文件...
stat -f [选项]... 文件系统...
-f 选项显示文件系统的状态信息| 选项 | 说明 |
|---|---|
| -L, --dereference | 跟随符号链接(显示链接指向的文件信息) |
| -f, --file-system | 显示文件系统状态而非文件状态 |
| -c, --format=格式 | 使用指定格式输出,格式字符串见下文 |
| --printf=格式 | 类似 -c,但解释转义字符 |
| -t, --terse | 以简洁格式显示信息 |
| --help | 显示帮助信息 |
| --version | 显示版本信息 |
使用 -c 或 --format 选项时,可以使用以下格式符:
%n - 文件名%s - 总大小,字节为单位%b - 分配的块数%F - 文件类型%f - 原始模式(16进制)%u - 所有者用户ID%g - 所有者组ID%U - 所有者用户名%G - 所有者组名%i - inode号%a - 访问时间%m - 修改时间%c - 状态改变时间%w - 文件创建时间%x - 访问时间(人类可读)%y - 修改时间(人类可读)%z - 状态改变时间(人类可读)# 显示文件详细信息
stat /etc/passwd
File: /etc/passwd
Size: 2913 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 1572876 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2023-10-15 08:30:25.123456789 +0800
Modify: 2023-09-20 14:15:30.987654321 +0800
Change: 2023-09-20 14:15:30.987654321 +0800
Birth: 2023-01-01 00:00:00.000000000 +0800
# 显示多个文件的状态信息
stat file1.txt file2.txt dir1/
# 只显示文件名和大小
stat -c "文件名: %n, 大小: %s 字节" /etc/passwd
# 显示所有者和权限信息
stat -c "文件: %n | 所有者: %U(%u) | 权限: %A | 大小: %s" /etc/passwd
# 显示文件系统信息
stat -f /home
File: "/home"
ID: 5c7a4b3d2a1f0e9d Namelen: 255 Type: ext4
Block size: 4096 Fundamental block size: 4096
Blocks: Total: 48837888 Free: 32567123 Available: 30123456
Inodes: Total: 12222464 Free: 11234567
# 创建符号链接
ln -s /etc/passwd passwd.link
# 显示符号链接本身的信息(默认)
stat passwd.link
# 显示符号链接指向的文件信息
stat -L passwd.link
# 显示当前目录下所有.txt文件的修改时间
for file in *.txt; do
stat -c "文件: %n | 最后修改: %y" "$file"
done
#!/bin/bash
# 检查文件是否存在并获取信息
FILE="/var/log/syslog"
if [ -e "$FILE" ]; then
SIZE=$(stat -c %s "$FILE")
MOD_TIME=$(stat -c %y "$FILE")
PERMISSIONS=$(stat -c %A "$FILE")
echo "文件: $FILE"
echo "大小: $SIZE 字节"
echo "最后修改: $MOD_TIME"
echo "权限: $PERMISSIONS"
else
echo "文件不存在: $FILE"
fi
# 比较两个文件的修改时间
file1_time=$(stat -c %Y file1.txt)
file2_time=$(stat -c %Y file2.txt)
if [ $file1_time -gt $file2_time ]; then
echo "file1.txt 比 file2.txt 新"
else
echo "file2.txt 比 file1.txt 新"
fi
# 记录文件的原始状态
original_inode=$(stat -c %i /tmp/testfile)
original_size=$(stat -c %s /tmp/testfile)
# 一段时间后检查
current_inode=$(stat -c %i /tmp/testfile)
current_size=$(stat -c %s /tmp/testfile)
if [ $original_inode -ne $current_inode ]; then
echo "文件已被替换(inode改变)"
fi
if [ $original_size -ne $current_size ]; then
echo "文件大小已改变"
fi
-L 选项时,如果符号链接指向不存在的文件会报错