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. 注意事项
- 权限问题:普通用户只能查看有权限的文件和目录
- 文件不存在:如果文件或目录不存在,会报错”No such file or directory”
- 符号链接:默认显示符号链接本身的信息,使用
-L选项显示指向文件的信息 - 格式选项:使用
-c、--format、--printf选项可以自定义输出格式 - 文件系统信息:使用
-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系统文件管理的基础工具,熟练掌握可以有效地查看文件和文件系统的详细状态信息。