Linux常用命令学习笔记:stat

1. 命令概述

  • 命令名称stat(英文全拼:statistics)
  • 核心功能显示文件或文件系统的详细状态信息
  • 主要用途:查看文件的元数据信息,包括大小、权限、所有者、时间戳等
  • 特点:提供比 ls更详细的文件信息,支持多种输出格式

2. 语法格式

stat [选项] [文件或目录]

3. 常用选项

选项说明
-f显示文件系统状态信息
-L跟随符号链接
-t以简洁格式显示
-c使用指定格式显示
--format使用指定格式显示
--printf使用指定格式显示,并解释转义字符
-x以类似 ls -l 的格式显示
--help显示帮助信息
--version显示版本信息

4. 基本操作

(1) 显示文件状态信息

# 显示文件状态信息
stat filename

# 显示目录状态信息
stat dirname

# 显示多个文件状态信息
stat file1 file2 file3

# 显示当前目录状态信息
stat .

# 显示上级目录状态信息
stat ..

(2) 显示文件系统状态信息

# 显示文件系统状态信息
stat -f filename

# 显示目录的文件系统状态信息
stat -f dirname

# 显示当前目录的文件系统状态信息
stat -f .

# 显示根目录的文件系统状态信息
stat -f /

# 显示多个文件系统的状态信息
stat -f file1 file2 file3

(3) 跟随符号链接

# 显示符号链接的状态信息
stat linkname

# 显示符号链接指向的文件状态信息
stat -L linkname

# 显示符号链接指向的文件状态信息,以简洁格式
stat -L -t linkname

# 显示符号链接指向的文件状态信息,以类似 ls -l 的格式
stat -L -x linkname

(4) 以简洁格式显示

# 以简洁格式显示文件状态信息
stat -t filename

# 以简洁格式显示目录状态信息
stat -t dirname

# 以简洁格式显示多个文件状态信息
stat -t file1 file2 file3

# 以简洁格式显示文件系统状态信息
stat -t -f filename

# 以简洁格式显示目录的文件系统状态信息
stat -t -f dirname

(5) 以类似 ls -l 的格式显示

# 以类似 ls -l 的格式显示文件状态信息
stat -x filename

# 以类似 ls -l 的格式显示目录状态信息
stat -x dirname

# 以类似 ls -l 的格式显示多个文件状态信息
stat -x file1 file2 file3

# 以类似 ls -l 的格式显示文件系统状态信息
stat -x -f filename

# 以类似 ls -l 的格式显示目录的文件系统状态信息
stat -x -f dirname

5. 常用实例详解

(1) 基本显示示例

# 显示文件状态信息
stat test.txt
# 输出:
#   File: test.txt
#   Size: 1024      	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: 2023-01-01 12:00:00.000000000 +0800
# Modify: 2023-01-01 12:00:00.000000000 +0800
# Change: 2023-01-01 12:00:00.000000000 +0800
#  Birth: 2023-01-01 12:00:00.000000000 +0800

# 显示目录状态信息
stat dirname
# 输出:
#   File: dirname
#   Size: 4096      	Blocks: 8          IO Block: 4096   directory
# Device: 801h/2049d	Inode: 654321      Links: 2
# Access: (0755/drwxr-xr-x)  Uid: ( 1000/   user)   Gid: ( 1000/   user)
# Access: 2023-01-01 12:00:00.000000000 +0800
# Modify: 2023-01-01 12:00:00.000000000 +0800
# Change: 2023-01-01 12:00:00.000000000 +0800
#  Birth: 2023-01-01 12:00:00.000000000 +0800

# 显示多个文件状态信息
stat file1 file2 file3
# 输出:分别显示三个文件的状态信息

(2) 简洁格式显示示例

# 以简洁格式显示文件状态信息
stat -t test.txt
# 输出:test.txt 1024 8 81a4 1000 1000 801 123456 1 0 0 1640995200 1640995200 1640995200 1640995200 4096

# 以简洁格式显示目录状态信息
stat -t dirname
# 输出:dirname 4096 8 41ed 1000 1000 801 654321 2 0 0 1640995200 1640995200 1640995200 1640995200 4096

# 以简洁格式显示多个文件状态信息
stat -t file1 file2 file3
# 输出:分别显示三个文件的简洁格式状态信息

(3) 类似 ls -l 格式显示示例

# 以类似 ls -l 的格式显示文件状态信息
stat -x test.txt
# 输出:
#   File: "test.txt"
#   Size: 1024            FileType: Regular File
#   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: Sun Jan  1 12:00:00 2023
# Modify: Sun Jan  1 12:00:00 2023
# Change: Sun Jan  1 12:00:00 2023
#  Birth: Sun Jan  1 12:00:00 2023

# 以类似 ls -l 的格式显示目录状态信息
stat -x dirname
# 输出:
#   File: "dirname"
#   Size: 4096            FileType: Directory
#   Blocks: 8             IO Block: 4096       directory
# Device: 801h/2049d      Inode: 654321        Links: 2
# Access: (0755/drwxr-xr-x)  Uid: ( 1000/   user)   Gid: ( 1000/   user)
# Access: Sun Jan  1 12:00:00 2023
# Modify: Sun Jan  1 12:00:00 2023
# Change: Sun Jan  1 12:00:00 2023
#  Birth: Sun Jan  1 12:00:00 2023

# 以类似 ls -l 的格式显示多个文件状态信息
stat -x file1 file2 file3
# 输出:分别显示三个文件的类似 ls -l 格式状态信息

(4) 文件系统状态信息显示示例

# 显示文件系统状态信息
stat -f test.txt
# 输出:
#   File: "test.txt"
#     ID: 0        Namelen: 255     Type: ext4
# Block size: 4096       Fundamental block size: 4096
# Blocks: Total: 1048576    Free: 1048576    Available: 1048576
# Inodes: Total: 1048576    Free: 1048576

# 显示目录的文件系统状态信息
stat -f dirname
# 输出:
#   File: "dirname"
#     ID: 0        Namelen: 255     Type: ext4
# Block size: 4096       Fundamental block size: 4096
# Blocks: Total: 1048576    Free: 1048576    Available: 1048576
# Inodes: Total: 1048576    Free: 1048576

# 以简洁格式显示文件系统状态信息
stat -t -f test.txt
# 输出:test.txt ext4 4096 4096 1048576 1048576 1048576 1048576 1048576 255

# 以类似 ls -l 的格式显示文件系统状态信息
stat -x -f test.txt
# 输出:
#   File: "test.txt"
#     ID: 0        Namelen: 255     Type: ext4
# Block size: 4096       Fundamental block size: 4096
# Blocks: Total: 1048576    Free: 1048576    Available: 1048576
# Inodes: Total: 1048576    Free: 1048576

(5) 符号链接处理示例

# 创建符号链接
ln -s /path/to/target linkname

# 显示符号链接的状态信息
stat linkname
# 输出:
#   File: linkname -> /path/to/target
#   Size: 13        	Blocks: 0          IO Block: 4096   symbolic link
# Device: 801h/2049d	Inode: 789012      Links: 1
# Access: (0777/lrwxrwxrwx)  Uid: ( 1000/   user)   Gid: ( 1000/   user)
# Access: 2023-01-01 12:00:00.000000000 +0800
# Modify: 2023-01-01 12:00:00.000000000 +0800
# Change: 2023-01-01 12:00:00.000000000 +0800
#  Birth: 2023-01-01 12:00:00.000000000 +0800

# 显示符号链接指向的文件状态信息
stat -L linkname
# 输出:
#   File: /path/to/target
#   Size: 1024      	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: 2023-01-01 12:00:00.000000000 +0800
# Modify: 2023-01-01 12:00:00.000000000 +0800
# Change: 2023-01-01 12:00:00.000000000 +0800
#  Birth: 2023-01-01 12:00:00.000000000 +0800

# 以简洁格式显示符号链接指向的文件状态信息
stat -L -t linkname
# 输出:/path/to/target 1024 8 81a4 1000 1000 801 123456 1 0 0 1640995200 1640995200 1640995200 1640995200 4096

# 以类似 ls -l 的格式显示符号链接指向的文件状态信息
stat -L -x linkname
# 输出:
#   File: "/path/to/target"
#   Size: 1024            FileType: Regular File
#   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: Sun Jan  1 12:00:00 2023
# Modify: Sun Jan  1 12:00:00 2023
# Change: Sun Jan  1 12:00:00 2023
#  Birth: Sun Jan  1 12:00:00 2023

6. 自定义格式显示

(1) 使用 -c选项

# 显示文件名
stat -c %n filename

# 显示文件大小
stat -c %s filename

# 显示文件权限
stat -c %a filename
stat -c %A filename

# 显示文件所有者
stat -c %U filename
stat -c %u filename

# 显示文件所属组
stat -c %G filename
stat -c %g filename

# 显示文件访问时间
stat -c %x filename
stat -c %X filename

# 显示文件修改时间
stat -c %y filename
stat -c %Y filename

# 显示文件状态改变时间
stat -c %z filename
stat -c %Z filename

# 显示文件创建时间
stat -c %w filename
stat -c %W filename

# 显示文件inode号
stat -c %i filename

# 显示文件硬链接数
stat -c %h filename

# 显示文件块大小
stat -c %B filename

# 显示文件块数
stat -c %b filename

# 显示文件设备号
stat -c %d filename
stat -c %D filename

# 显示文件类型
stat -c %F filename

# 显示文件系统ID
stat -c %C filename

# 显示文件系统块大小
stat -c %S filename

# 显示文件系统总块数
stat -c %b filename

# 显示文件系统可用块数
stat -c %a filename

# 显示文件系统可用inode数
stat -c %i filename

# 显示文件系统总inode数
stat -c %c filename

# 显示文件系统类型
stat -c %T filename

# 显示文件系统名称最大长度
stat -c %l filename

# 组合显示多个信息
stat -c "%n %s %a %U %G %y" filename
stat -c "%n %s %A %U %G %Y" filename
stat -c "%n %s %a %u %g %y" filename
stat -c "%n %s %A %u %g %Y" filename

(2) 使用 --format选项

# 显示文件名
stat --format=%n filename

# 显示文件大小
stat --format=%s filename

# 显示文件权限
stat --format=%a filename
stat --format=%A filename

# 显示文件所有者
stat --format=%U filename
stat --format=%u filename

# 显示文件所属组
stat --format=%G filename
stat --format=%g filename

# 显示文件访问时间
stat --format=%x filename
stat --format=%X filename

# 显示文件修改时间
stat --format=%y filename
stat --format=%Y filename

# 显示文件状态改变时间
stat --format=%z filename
stat --format=%Z filename

# 显示文件创建时间
stat --format=%w filename
stat --format=%W filename

# 显示文件inode号
stat --format=%i filename

# 显示文件硬链接数
stat --format=%h filename

# 显示文件块大小
stat --format=%B filename

# 显示文件块数
stat --format=%b filename

# 显示文件设备号
stat --format=%d filename
stat --format=%D filename

# 显示文件类型
stat --format=%F filename

# 显示文件系统ID
stat --format=%C filename

# 显示文件系统块大小
stat --format=%S filename

# 显示文件系统总块数
stat --format=%b filename

# 显示文件系统可用块数
stat --format=%a filename

# 显示文件系统可用inode数
stat --format=%i filename

# 显示文件系统总inode数
stat --format=%c filename

# 显示文件系统类型
stat --format=%T filename

# 显示文件系统名称最大长度
stat --format=%l filename

# 组合显示多个信息
stat --format="%n %s %a %U %G %y" filename
stat --format="%n %s %A %U %G %Y" filename
stat --format="%n %s %a %u %g %y" filename
stat --format="%n %s %A %u %g %Y" filename

(3) 使用 --printf选项

# 显示文件名,并换行
stat --printf="%n\n" filename

# 显示文件大小,并换行
stat --printf="%s\n" filename

# 显示文件权限,并换行
stat --printf="%a\n" filename
stat --printf="%A\n" filename

# 显示文件所有者,并换行
stat --printf="%U\n" filename
stat --printf="%u\n" filename

# 显示文件所属组,并换行
stat --printf="%G\n" filename
stat --printf="%g\n" filename

# 显示文件访问时间,并换行
stat --printf="%x\n" filename
stat --printf="%X\n" filename

# 显示文件修改时间,并换行
stat --printf="%y\n" filename
stat --printf="%Y\n" filename

# 显示文件状态改变时间,并换行
stat --printf="%z\n" filename
stat --printf="%Z\n" filename

# 显示文件创建时间,并换行
stat --printf="%w\n" filename
stat --printf="%W\n" filename

# 显示文件inode号,并换行
stat --printf="%i\n" filename

# 显示文件硬链接数,并换行
stat --printf="%h\n" filename

# 显示文件块大小,并换行
stat --printf="%B\n" filename

# 显示文件块数,并换行
stat --printf="%b\n" filename

# 显示文件设备号,并换行
stat --printf="%d\n" filename
stat --printf="%D\n" filename

# 显示文件类型,并换行
stat --printf="%F\n" filename

# 显示文件系统ID,并换行
stat --printf="%C\n" filename

# 显示文件系统块大小,并换行
stat --printf="%S\n" filename

# 显示文件系统总块数,并换行
stat --printf="%b\n" filename

# 显示文件系统可用块数,并换行
stat --printf="%a\n" filename

# 显示文件系统可用inode数,并换行
stat --printf="%i\n" filename

# 显示文件系统总inode数,并换行
stat --printf="%c\n" filename

# 显示文件系统类型,并换行
stat --printf="%T\n" filename

# 显示文件系统名称最大长度,并换行
stat --printf="%l\n" filename

# 组合显示多个信息,并换行
stat --printf="%n %s %a %U %G %y\n" filename
stat --printf="%n %s %A %U %G %Y\n" filename
stat --printf="%n %s %a %u %g %y\n" filename
stat --printf="%n %s %A %u %g %Y\n" filename

7. 实际应用场景

场景一:文件信息监控

# 监控文件大小变化
stat -c %s filename

# 监控文件修改时间
stat -c %y filename

# 监控文件访问时间
stat -c %x filename

# 监控文件状态改变时间
stat -c %z filename

# 监控文件创建时间
stat -c %w filename

# 监控文件权限变化
stat -c %a filename

# 监控文件所有者变化
stat -c %U filename

# 监控文件所属组变化
stat -c %G filename

# 监控文件inode号变化
stat -c %i filename

# 监控文件硬链接数变化
stat -c %h filename

场景二:文件系统监控

# 监控文件系统块大小
stat -c %S filename

# 监控文件系统总块数
stat -c %b filename

# 监控文件系统可用块数
stat -c %a filename

# 监控文件系统总inode数
stat -c %c filename

# 监控文件系统可用inode数
stat -c %i filename

# 监控文件系统类型
stat -c %T filename

# 监控文件系统名称最大长度
stat -c %l filename

# 监控文件系统ID
stat -c %C filename

场景三:脚本中的文件信息获取

#!/bin/bash

# 获取文件大小
FILE_SIZE=$(stat -c %s filename)

# 获取文件修改时间
FILE_MODIFY=$(stat -c %y filename)

# 获取文件访问时间
FILE_ACCESS=$(stat -c %x filename)

# 获取文件状态改变时间
FILE_CHANGE=$(stat -c %z filename)

# 获取文件创建时间
FILE_CREATE=$(stat -c %w filename)

# 获取文件权限
FILE_PERM=$(stat -c %a filename)

# 获取文件所有者
FILE_OWNER=$(stat -c %U filename)

# 获取文件所属组
FILE_GROUP=$(stat -c %G filename)

# 获取文件inode号
FILE_INODE=$(stat -c %i filename)

# 获取文件硬链接数
FILE_LINKS=$(stat -c %h filename)

# 获取文件块大小
FILE_BLOCK_SIZE=$(stat -c %B filename)

# 获取文件块数
FILE_BLOCKS=$(stat -c %b filename)

# 获取文件设备号
FILE_DEVICE=$(stat -c %d filename)

# 获取文件类型
FILE_TYPE=$(stat -c %F filename)

# 获取文件系统块大小
FS_BLOCK_SIZE=$(stat -c %S filename)

# 获取文件系统总块数
FS_TOTAL_BLOCKS=$(stat -c %b filename)

# 获取文件系统可用块数
FS_AVAILABLE_BLOCKS=$(stat -c %a filename)

# 获取文件系统总inode数
FS_TOTAL_INODES=$(stat -c %c filename)

# 获取文件系统可用inode数
FS_AVAILABLE_INODES=$(stat -c %i filename)

# 获取文件系统类型
FS_TYPE=$(stat -c %T filename)

# 获取文件系统名称最大长度
FS_NAME_LEN=$(stat -c %l filename)

# 获取文件系统ID
FS_ID=$(stat -c %C filename)

场景四:文件系统信息获取

#!/bin/bash

# 获取文件系统块大小
FS_BLOCK_SIZE=$(stat -f -c %S filename)

# 获取文件系统总块数
FS_TOTAL_BLOCKS=$(stat -f -c %b filename)

# 获取文件系统可用块数
FS_AVAILABLE_BLOCKS=$(stat -f -c %a filename)

# 获取文件系统总inode数
FS_TOTAL_INODES=$(stat -f -c %c filename)

# 获取文件系统可用inode数
FS_AVAILABLE_INODES=$(stat -f -c %i filename)

# 获取文件系统类型
FS_TYPE=$(stat -f -c %T filename)

# 获取文件系统名称最大长度
FS_NAME_LEN=$(stat -f -c %l filename)

# 获取文件系统ID
FS_ID=$(stat -f -c %C filename)

8. 与其他命令的区别

命令特点适用场景
stat显示文件或文件系统的详细状态信息查看文件的元数据信息
ls列出目录内容查看文件列表
ls -l显示文件详细信息查看文件权限、大小、时间等
file显示文件类型查看文件类型
du显示文件或目录的磁盘使用情况查看文件或目录的磁盘使用情况
df显示文件系统磁盘空间使用情况查看文件系统磁盘空间使用情况

9. 注意事项

  1. 权限问题:普通用户只能查看有权限的文件和目录
  2. 文件不存在:如果文件或目录不存在,会报错”No such file or directory”
  3. 符号链接:默认显示符号链接本身的信息,使用 -L选项显示指向文件的信息
  4. 格式选项:使用 -c--format--printf选项可以自定义输出格式
  5. 文件系统信息:使用 -f选项可以显示文件系统状态信息

10. 常见问题解决

(1) 权限不足

# 错误:权限不足
stat /root/file  # 报错:Permission denied

# 正确:使用sudo
sudo stat /root/file

# 正确:查看有权限的文件
stat /home/user/file

# 正确:查看当前用户的主目录文件
stat ~/file

# 正确:查看公共目录文件
stat /tmp/file

(2) 文件不存在

# 错误:文件不存在
stat nonexistent  # 报错:No such file or directory

# 正确:检查文件是否存在
ls -l filename

# 正确:使用存在的文件
stat existing_file

# 正确:创建文件
touch filename
stat filename

# 正确:忽略不存在的文件错误
stat nonexistent 2>/dev/null

(3) 符号链接问题

# 错误:符号链接指向不存在的文件
ln -s /nonexistent broken_link
stat broken_link  # 报错:No such file or directory

# 正确:检查符号链接
ls -l linkname

# 正确:修复符号链接
ln -sf /path/to/target linkname

# 正确:使用物理路径
stat /path/to/target

# 正确:使用绝对路径
stat $(readlink linkname)

(4) 选项错误

# 错误:选项错误
stat -x filename  # 报错:无效选项

# 正确:使用支持的选项
stat -t filename
stat -c filename
stat -f filename

# 错误:缺少参数
stat --  # 报错:缺少参数

# 正确:使用正确的选项
stat --help
stat --version

# 错误:选项冲突
stat -t -c filename  # 可能报错

# 正确:使用不冲突的选项
stat -t filename
stat -c filename

核心要点总结

  • stat是显示文件或文件系统详细状态信息的命令
  • 常用选项-f(显示文件系统状态信息)、-L(跟随符号链接)、-t(以简洁格式显示)、-c(使用指定格式显示)、-x(以类似 ls -l 的格式显示)
  • 实际应用:文件信息监控、文件系统监控、脚本中的文件信息获取、文件系统信息获取
  • 注意事项:普通用户只能查看有权限的文件和目录,使用 -L选项可以显示符号链接指向文件的信息

stat命令是Linux系统文件管理的基础工具,熟练掌握可以有效地查看文件和文件系统的详细状态信息。


作 者:南烛
链 接:https://www.itnotes.top/archives/491
来 源:IT笔记
文章版权归作者所有,转载请注明出处!


上一篇
下一篇