如何在 Linux 上使用 stat 命令

已发表: 2022-01-29
Ubuntu 风格桌面上的 Linux 终端。
Fatmawati Achmad Zaenuri/Shutterstock.com

Linux stat命令比ls显示的详细信息要多得多。 使用这个信息丰富且可配置的实用程序窥探幕后。 我们将向您展示如何使用它。

stat 带你走进幕后

ls命令非常擅长它所做的事情——而且它做了很多事情——但是对于 Linux,似乎总有一种方法可以更深入地了解表面之下的内容。 通常,这不仅仅是抬起地毯边缘的情况。 您可以撕开地板,然后挖一个洞。 你可以像剥洋葱一样剥 Linux。

10 个适合初学者的基本 Linux 命令
相关10 个适合初学者的基本 Linux 命令

ls将向您显示有关文件的大量信息,例如对其设置了哪些权限,文件有多大,以及它是文件还是符号链接。 为了显示这些信息, ls从一个称为 inode 的文件系统结构中读取它。

每个文件和目录都有一个 inode。 inode 保存有关文件的元数据,例如它占用的文件系统块以及与文件关联的日期戳。 inode 就像文件的借书证。 但是ls只会显示一些信息。 要查看所有内容,我们需要使用stat命令。

ls一样, stat命令有很多选项。 这使它成为使用别名的理想选择。 一旦你发现了一组特定的选项可以让stat为你提供你想要的输出,将它包装在一个别名或 shell 函数中。 这使它使用起来更加方便,而且您不必记住一组晦涩难懂的命令行选项。

相关:如何在 Linux 上使用 ls 命令列出文件和目录

快速比较

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

 ls -lh ana.h 

广告

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

  • 第一个字符是连字符“-”,这告诉我们该文件是常规文件,而不是套接字、符号链接或其他类型的对象。
  • 所有者、组和其他权限以八进制格式列出。
  • 指向此文件的硬链接数。 在这种情况下,并且在大多数情况下,它将是一个。
  • 文件所有者是戴夫。
  • 群主是戴夫。
  • 文件大小为 802 字节。
  • 该文件最后一次修改是在 2015 年 12 月 13 日星期五。
  • 文件名为ana.c

让我们看一下stat

 统计数据

我们从stat得到的信息是:

  • 文件:文件的名称。 通常,它与我们在命令行中传递给stat的名称相同,但如果我们查看的是符号链接,它可能会有所不同。
  • Size :文件的大小(以字节为单位)。
  • Blocks :文件需要的文件系统块数,以便存储在硬盘上。
  • IO 块:文件系统块的大小。
  • 文件类型:元数据描述的对象类型。 最常见的类型是文件和目录,但它们也可以是链接、套接字或命名管道。
  • Device : 十六进制和十进制的设备号。 这是存储文件的硬盘驱动器的 ID。
  • 索引节点:索引节点编号。 也就是这个inode的ID号。 inode 号和设备号一起唯一标识一个文件。
  • Links :这个数字表示有多少硬链接指向这个文件。 每个硬链接都有自己的 inode。 所以考虑这个数字的另一种方法是有多少 inode 指向这个文件。 每次创建或删除硬链接时,此数字都会向上或向下调整。 当它达到零时,文件本身已被删除,并且 inode 被删除。 如果在目录上使用stat ,这个数字代表目录中的文件数,包括“.”。 当前目录的条目和父目录的“..”条目。
  • 访问:文件权限以八进制和传统的rwx (读、写、执行格式)显示。
  • Uid :所有者的用户 ID 和帐户名。
  • Gid :所有者的组 ID 和帐户名。
  • 访问:访问时间戳。 不像看起来那么简单。 现代 Linux 发行版使用一种称为relatime的方案,它试图优化更新访问时间所需的硬盘驱动器写入。 简单地说,如果访问时间早于修改时间,则更新访问时间。
  • Modify :修改时间戳。 这是文件内容最后一次修改的时间。 (幸运的是,这个文件的内容最后一次更改是四年前到今天。)
  • 更改:更改时间戳。 这是文件的属性内容最后一次更改的时间。 如果通过设置新的文件权限来修改文件,更改时间戳会更新(因为文件属性已更改),但修改后的时间戳不会更新(因为文件内容未更改)。
  • Birth :保留以显示文件的原始创建日期,但这在 Linux 中没有实现。

了解时间戳

时间戳对时区敏感。 每行末尾的-0500表示此文件是在比当前计算机的时区早 5 小时的协调世界时 (UTC) 时区的计算机上创建的。 所以这台电脑比创建这个文件的电脑晚了五个小时。 事实上,该文件是在英国时区计算机上创建的,我们在美国东部标准时区的计算机上查看它。

修改和更改时间戳可能会引起混淆,因为对于外行来说,它们的名称听起来好像它们的意思是一样的。

让我们使用chmod来修改名为ana.c的文件的文件权限。 我们将使它对每个人都可写。 这不会影响文件的内容,但会影响文件的属性。

 chmod +w ana.c

然后我们将使用stat查看时间戳:

 统计分析.c 

广告

更改时间戳已更新,但修改后的时间戳尚未更新。

仅当文件内容发生更改时,才会更新修改后的时间戳。 更改时间戳会针对内容更改和属性更改进行更新。

对多个文件使用 Stat

要一次对多个文件进行 stat 报告,请在命令行上将文件名传递给stat

 统计 ana.h ana.o 

要对一组文件使用stat ,请使用模式匹配。 问号“?” 表示任意单个字符,星号“*”表示任意字符串。 我们可以使用以下命令告诉stat报告任何名为“ana”且具有单个字母扩展名的文件:

 统计数据。? 

使用 stat 报告文件系统

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

 stat -f ana.c 

stat给我们的信息是:

  • 文件:文件的名称。
  • ID :以十六进制表示的文件系统 ID。
  • Namelen :文件名的最大允许长度。
  • 类型:文件系统的类型。
  • 块大小:请求读取请求以获得最佳数据传输速率的数据量。
  • 基本块大小:每个文件系统块的大小。

块:

  • Total :文件系统中所有块的总数。
  • Free :文件系统中的空闲块数。
  • 可用:普通(非 root)用户可用的空闲块数。

索引节点:

  • Total :文件系统中的 inode 总数。
  • Free :文件系统中的空闲 inode 数量。

取消引用符号链接

如果您在实际上是符号链接的文件上使用stat ,它将报告该链接。 如果您希望stat报告链接指向的文件,请使用-L (取消引用)选项。 文件code.cana.c的符号链接。 让我们看一下没有-L选项的情况:

 统计代码.c 

广告

文件名显示code.c指向 ( -> ) ana.c 。 文件大小只有 11 个字节。 有零个块专门用于存储此链接。 文件类型被列为符号链接。

显然,我们在这里查看的不是实际文件。 让我们再次这样做并添加-L选项:

 stat -L code.c 

现在显示符号链接指向的文件的文件详细信息。 但请注意,文件名仍为code.c 。 这是链接的名称,而不是目标文件。 发生这种情况是因为这是我们在命令行stat的名称。

简短的报告

-t (简洁)选项使stat提供简明摘要:

 stat -t ana.c 

没有给出任何线索。 为了理解它——直到你记住了字段序列——你需要交叉引用这个输出到一个完整的stat输出。

自定义输出格式

stat获取不同数据集的更好方法是使用自定义格式。 有一长串称为格式序列的标记。 这些中的每一个都代表一个数据元素。 选择要包含在输出中的那些并创建格式字符串。 当我们调用stat并将格式字符串传递给它时,输出将只包含我们请求的数据元素。

广告

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

  • %a :八进制的访问权限。
  • %A :人类可读形式的访问权限( rwx )。
  • %b :分配的块数。
  • %B :每个块的大小(以字节为单位)。
  • %d : 十进制的设备号。
  • %D : 十六进制的设备号。
  • %f : 十六进制的原始模式。
  • %F文件类型。
  • %g : 所有者的组 ID。
  • %G :所有者的组名。
  • %h : 硬链接数。
  • %i :inode 编号。
  • %m : 挂载点。
  • %n : 文件名。
  • %N :引用的文件名,如果是符号链接,则使用取消引用的文件名。
  • %o :最佳 I/O 传输大小提示。
  • %s :总大小,以字节为单位。
  • %t : 十六进制的主要设备类型,用于字符/块设备特殊文件。
  • %T :十六进制的次要设备类型,用于字符/块设备特殊文件。
  • %u : 所有者的用户 ID。
  • %U :所有者的用户名。
  • %w :文件诞生的时间,人类可读的,如果未知,则为连字符“-”。
  • %W :文件诞生的时间,自 Epoch 以来的秒数; 0 如果未知。
  • %x :上次访问的时间,可读。
  • %X :上次访问的时间,自 Epoch 以来的秒数。
  • %y :最后一次数据修改的时间,可读。
  • %Y :最后一次数据修改的时间,自 Epoch 以来的秒数。
  • %z :上次状态变化的时间,可读。
  • %Z :上次状态更改的时间,自 Epoch 以来的秒数。

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

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

  • %a :普通(非root)用户可用的空闲块数。
  • %b :文件系统中的总数据块。
  • %c :文件系统中的总 inode。
  • %d : 文件系统中空闲 inode 的数量。
  • %f :文件系统中的空闲块数。
  • %i : 十六进制的文件系统 ID。
  • %l : 文件名的最大长度。
  • %n : 文件名。
  • %s :块大小(最佳写入大小)。
  • %S :文件系统块的大小(用于块计数)。
  • %t : 十六进制的文件系统类型。
  • %T :人类可读形式的文件系统类型。

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

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

 "文件 %n 是 %s 字节,并且是 %F\n"

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

 stat --printf="文件 %n 是 %s 字节,并且是 %F\n" code.c ana/ana.? 

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

广告

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

细粒控制

如您所见,提取您感兴趣的特定数据元素的空间很大。 您可能还可以看到为什么我们建议为更长和更复杂的咒语使用别名。

相关:适合开发人员和爱好者的最佳 Linux 笔记本电脑