如何在Linux上使用stat命令

时间:2020-01-09 10:39:56  来源:igfitidea点击:

Linuxstat命令向我们显示的细节比ls多得多。

ls和stat比较

让我们用ls给我们列出一个长长的列表(-l选项),它具有人类可读的文件大小(-h选项):

ls -lh ana.h

从左到右,ls提供的信息是:

  • 第一个字符是连字符-这告诉我们文件是常规文件,而不是套接字,符号链接或者其他类型的对象。

  • 所有者,组和其他权限以八进制格式列出。

  • 指向此文件的硬链接数。在这种情况下,并且在大多数情况下,它将是其中之一。

  • 文件所有者是dave。

  • 群组所有者是dave。

  • 文件大小为802字节。

  • 该文件的最后修改时间为2014年12月13日,星期五。

  • 文件名为" ana.c"。

让我们来看看stat

stat ana.h

我们从stat中获得的信息是:

  • 文件:文件名。通常,它与我们在命令行中传递给stat的名称相同,但是如果我们查看符号链接,则可能会有所不同。

  • 大小:文件大小,以字节为单位。

  • 块:文件所需的文件系统块数,以便存储在硬盘驱动器上。

  • IO块:文件系统块的大小。

  • 文件类型:元数据描述的对象的类型。最常见的类型是文件和目录,但它们也可以是链接,套接字或者命名管道。

  • 设备:设备编号(十六进制和十进制)。这是存储文件的硬盘驱动器的ID。

  • 索引节点:索引节点编号。即,此索引节点的ID号。索引节点号和设备号一起唯一地标识一个文件。

  • 链接:此数字表示指向该文件的硬链接数。每个硬链接都有其自己的索引节点。因此,考虑该图的另一种方法是有多少个inode指向该文件。每次创建或者删除硬链接时,此数字都会向上或者向下调整。当它达到零时,文件本身已被删除,并且索引节点也被删除。如果我们在目录上使用stat,则该数字代表目录中的文件数,包括。当前目录的条目,父目录的..条目。

  • 访问:文件权限以八进制和传统的" rwx"(读,写,执行格式)显示。

  • Uid:所有者的用户ID和帐户名。

  • Gid:所有者的组ID和帐户名。

  • 访问:访问时间戳。不像看起来那样简单。现代Linux发行版使用一种称为" relatime"的方案,该方案试图优化更新访问时间所需的硬盘驱动器写入。简而言之,如果访问时间早于修改时间,则更新时间。

  • 修改:修改时间戳。这是上次修改文件内容的时间。 (很幸运,此文件的内容最后一次更改是在四年前的今天。)

  • 变更:变更时间戳记。这是文件属性或者内容的最后更改时间。如果通过设置新文件权限来修改文件,则更改时间戳将被更新(因为文件属性已更改),但是修改后的时间戳将不会被更新(因为文件内容未更改)。

  • 出生日期:保留以显示文件的原始创建日期,但是在Linux中未实现。

使用stat来报告文件系统

stat可以报告文件系统的状态以及文件的状态。 -f(文件系统)选项告诉stat来报告文件所在的文件系统。请注意,我们也可以将/之类的目录传递给stat而不是文件名。

stat -f ana.c

stat提供给我们的信息是:

  • 文件:文件名。

  • ID:以十六进制表示的文件系统ID。

  • Namelen:文件名的最大允许长度。

  • 类型:文件系统的类型。

  • 块大小:请求读取请求以获取最佳数据传输速率的数据量。

  • 基本块大小:每个文件系统块的大小。

方块:

  • 总数:文件系统中所有块的总数。

  • 空闲:文件系统中的空闲块数。

  • 可用:普通(非root)用户可用的可用块数。

索引节点:

  • 总数:文件系统中索引节点的总数。

  • 空闲:文件系统中空闲索引节点的数量。

自定义输出格式

stat获取另一组数据的更好方法是使用自定义格式。有很长的令牌列表,称为格式序列。这些每个代表一个数据元素。选择要包含在输出中的内容,然后创建一个格式字符串。当我们调用stat并将格式字符串传递给它时,输出将仅包含我们请求的数据元素。

文件和文件系统有不同的格式序列集。文件列表为:

  • %a:八进制访问权限。

  • %A:可读格式(rwx)的访问权限。

  • %b:分配的块数。

  • %B:每个块的大小(以字节为单位)。

  • %d:设备编号(十进制)。

  • %D:十六进制的设备号。

  • %f:十六进制的原始模式。

  • %F文件类型。

  • %g:所有者的组ID。

  • %G:所有者的组名。

  • %h:硬链接数。

  • %i:索引节点号。

  • %m:安装点。

  • %n:文件名。

  • %N:带引号的文件名,如果是符号链接,则带有解引用的文件名。

  • %o:最佳I / O传输大小提示。

  • %s:总大小,以字节为单位。

  • %t:十六进制的主要设备类型,用于字符/块设备专用文件。

  • %T:十六进制的次要设备类型,用于字符/块设备特殊文件。

  • %u:所有者的用户标识。

  • %U:所有者的用户名。

  • %w:文件的诞生时间,可读性或者连字符号(如果未知)。

  • %W:文件诞生的时间,距离纪元以来的秒数;如果未知,则为0。

  • %x:上次访问的时间,人类可以理解。

  • %X:上次访问的时间,距离纪元以来的秒数。

  • %y:上次数据修改的时间,人类可以理解。

  • %Y:上次修改数据的时间,自纪元以来的秒数。

  • %z:上次状态更改的时间,人类可以理解。

  • %Z:上一次状态更改的时间,距离纪元以来的秒数。

纪元是Unix纪元,它发生在1970-01-01 00:00:00 +0000(UTC)上。

对于文件系统,格式序列为:

  • %a:普通(非root)用户可用的空闲块数。

  • %b:文件系统中的总数据块。

  • %c:文件系统中的总索引节点。

  • %d:文件系统中空闲索引节点的数量。

  • %f:文件系统中的可用块数。

  • %i:文件系统ID(十六进制)。

  • %l:文件名的最大长度。

  • %n:文件名。

  • %s:块大小(最佳写入大小)。

  • %S:文件系统块的大小(用于块计数)。

  • %t:文件系统类型,十六进制。

  • %T:易于理解的文件系统类型。

有两个选项可以接受格式序列的字符串。这些是--format--printf。它们之间的区别是--printf解释C样式的转义序列,例如换行符\ n和制表符\ t,并且不会自动在其输出中添加换行符。

让我们创建一个格式字符串,并将其传递给stat。要使用的格式序列是:文件名"%n",文件大小"%s"和文件类型"%F"。我们将在字符串的末尾添加\ n转义序列,以确保每个文件都在新行中处理。我们的格式字符串如下所示:

"File %n is %s bytes, and is a %F\n"

我们将使用--printf选项将其传递给stat。我们要让stat报告一个名为code.c的文件以及一组与ana。?相匹配的文件。这是完整的命令。注意--printf和格式字符串之间的等号=

stat --printf="File %n is %s bytes, and is a %F\n" code.c ana/ana.?

每个文件的报告都在新行中列出,这是我们要求的。为我们提供了文件名,文件大小和文件类型。

自定义格式使我们可以访问比标准stat输出中包含的数据元素更多的数据元素。