在Linux上用stat命令检查文件状态的方法

173 阅读2分钟

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 命令都能让你轻松获得关于你的数据的数据。