stat命令

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来批量获取文件信息