Linux stat命令详解

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 - 状态改变时间(人类可读)

使用示例

示例1:基本用法 - 显示文件状态

# 显示文件详细信息
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

示例2:显示多个文件信息

# 显示多个文件的状态信息
stat file1.txt file2.txt dir1/

示例3:自定义输出格式

# 只显示文件名和大小
stat -c "文件名: %n, 大小: %s 字节" /etc/passwd
# 显示所有者和权限信息
stat -c "文件: %n | 所有者: %U(%u) | 权限: %A | 大小: %s" /etc/passwd

示例4:显示文件系统状态

# 显示文件系统信息
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

示例5:显示符号链接信息

# 创建符号链接
ln -s /etc/passwd passwd.link

# 显示符号链接本身的信息(默认)
stat passwd.link

# 显示符号链接指向的文件信息
stat -L passwd.link

示例6:批量处理文件

# 显示当前目录下所有.txt文件的修改时间
for file in *.txt; do
    stat -c "文件: %n | 最后修改: %y" "$file"
done

示例7:在脚本中使用stat

#!/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

进阶用法

1. 比较文件修改时间

# 比较两个文件的修改时间
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

2. 监控文件变化

# 记录文件的原始状态
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

注意事项

  • stat 命令在不同的Linux发行版中可能有轻微差异
  • "Birth"时间(创建时间)在某些文件系统上可能不可用
  • 使用 -L 选项时,如果符号链接指向不存在的文件会报错
  • 格式化输出时注意引号的使用,特殊字符可能需要转义
  • stat 显示的时间戳可以精确到纳秒级
  • 某些选项可能需要特定版本的 coreutils 才能使用

相关命令

  • ls - 列出目录内容(提供基本信息)
  • file - 确定文件类型
  • touch - 修改文件时间戳
  • find - 查找文件(可基于时间过滤)
  • df - 显示磁盘空间使用情况
  • du - 估算文件空间使用量