stat 命令,包括在GNUcoreutils 软件包中,提供了各种元数据,包括文件大小、节点位置、访问权限和SELinux环境,以及创建和修改时间,关于文件和文件系统。这是一个收集信息的便捷方式,而你通常需要用几个不同的命令来获取这些信息。
在Linux上安装stat
在Linux上,你可能已经安装了stat 命令,因为它是一个核心工具包的一部分,一般默认与Linux发行版捆绑在一起。
如果你没有安装stat ,你可以用你的软件包管理器安装coreutils 。
另外,你也可以从源代码编译coreutils。
获取文件的状态
运行stat ,提供关于特定文件或目录的容易阅读的输出。
$ stat planets.xml
File: planets.xml
Size: 325 Blocks: 8 IO Block: 4096 regular file
Device: fd03h/64771d Inode: 140217 Links: 1
Access: (0664/-rw-rw-r--) Uid: (1000/tux) Gid: (100/users)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2021-08-17 18:26:57.281330711 +1200
Modify: 2021-08-17 18:26:58.738332799 +1200
Change: 2021-08-17 18:26:58.738332799 +1200
Birth: 2021-08-17 18:26:57.281330711 +1200
它可能很容易阅读,但它仍然有很多信息。下面是stat 所涵盖的内容。
- 文件:文件名
- 大小:以字节为单位的文件大小
- 块:硬盘上为该文件保留的块数
- IO块:文件系统中一个块的大小
- 常规文件:文件的类型(常规文件、目录、文件系统)。
- 设备:文件所在的设备
- Inode:文件所在的节点号
- 链接:该文件的链接数
- Access, UID, GID:文件权限、用户和组主
- 语境。SELinux上下文
- Access, Modify, Change, Birth:文件被访问、修改、改变状态和创建的时间戳。
简短的输出
对于熟悉输出的人来说,或者想用其他工具如awk来解析输出,有一个--terse ( 简称-t )选项,它的输出格式没有标题或换行。
$ stat --terse planets.xml
planets.xml 325 8 81b4 100977 100 fd03 140217 1 0 0 1629181617 1629181618 1629181618 1629181617 4096 unconfined_u:object_r:user_home_t:s0
选择你自己的格式
你可以使用--printf 选项和类似printf 的语法来定义你自己的输出格式。由stat 报告的每个属性都有一个格式序列(%C 代表SELinux上下文,%n 代表文件名,以此类推),所以你可以选择你想在报告中看到的内容。
$ stat --printf="%n\n%C\n" planets.xml
planets.xml
unconfined_u:object_r:user_home_t:s0
$ $ stat --printf="Name: %n\nModified: %y\n" planets.xml
Name: planets.xml
Modified: 2021-08-17 18:26:58.738332799 +1200
下面是一些常见的格式序列。
- %A访问权限
- %F文件类型
- %N文件名称
- %U用户名称
- %u用户ID
- %g组ID
- %w出生时间
- %y修改时间
格式序列的完整清单可在stat man页和coreutils info页中找到。
文件信息
如果你曾经试图解析ls -l 的输出,那么你会欣赏stat 命令的灵活性。你并不总是需要stat 所提供的每一点默认信息,但当你确实需要某些或全部信息时,这个命令是非常宝贵的。无论你是以其默认格式阅读其输出,还是创建你自己的查询,stat 命令都能让你轻松获得关于你的数据的数据。