如何在Linux上使用stat命令
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
输出中包含的数据元素更多的数据元素。