stat

stat命令


stat命令用于显示文件的状态信息。stat命令的输出信息比ls命令的输出信息要更详细。

语法

stat(选项)(参数)

选项
参数 英文 中文
-L, –dereference follow links 如果是链接文件,则获取原文件信息
-Z, –context print the security context information if available 打印SElinux安全上下文信息
-f, –file-system display file system status instead of file status 显示文件所在的文件系统的状态
-c –format=FORMAT use the specified FORMAT instead of the default;output a newline after each use of FORMAT 自定义输出格式,结尾有换行
–printf=FORMAT like –format, but interpret backslash escapes,and do not output a mandatory trailing newline.If you want a newline, include \n in FORMAT. 自定义输出格式,结尾无换行符,需手动添加
-t, –terse print the information in terse form 以简洁的形式打印输出信息(在没有改变输出格式的情况下)
–help display this help and exit 打印帮助信息
–version output version information and exit 打印版本信息并退出
可选的文件信息输出格式
参数 英文 中文
%a Access rights in octal 八进制格式的文件访问权限
%A Access rights in human readable form 可读形式访问权限(ls -l情况下显示的样子)
%b Number of blocks allocated (see %B) 分配的块数(单位参照%B的数值)
%B The size in bytes of each block reported by %b 每个块的大小(这个值是指硬盘上存储单元块的大小,与格式化的block块大小不同)
%d Device number in decimal 设备号(10进制)
%D Device number in hex 设备号(十六进制)
%f Raw mode in hex raw 模式(十六进制,可以百度一下raw的意思)
%F File type 文件类型
%g Group ID of owner 文件所有者的组ID
%G Group name of owner 文件所有者的组名
%h Number of hard links 硬链接的数量(文件本身算1个)
%i Inode number inode号
%n File name 文件名
%N Quoted file name with dereference if symbolic link 取消软连接的文件名引用,变成普通字符串
%o I/O block size 系统格式化block的大小
%s Total size, in bytes 文件大小(单位byte)
%t Major device type in hex 主要设备类型(十六进制)
%T Minor device type in hex 次要设备类型(十六进制)
%u User ID of owner 所有者的用户ID
%U User name of owner 所有者的用户名
%x Time of last access 最后访问时间
%X Time of last access as seconds since Epoch 最后一次访问时间(大纪元秒)
%y Time of last modification 最后修改时间(内容改变)
%Y Time of last modification as seconds since Epoch 最后修改时间(内容改变)
%z Time of last change 最后改变时间(文件属性,权限所有者等,格式大纪元秒)
%Z Time of last change as seconds since Epoch 最后改变时间(文件属性,权限所有者等,格式大纪元秒)

stat -c "%a %A %b %B %d %D %f %F %g %G %h %i %n %N %o %s %t %T %u %U %x %X %y %Y %z %Z" file

可选的分区信息输出格式
参数 英文 中文
%a Free blocks available to non-superuser 普通用户可用的block数量
%b Total data blocks in file system 分区的总数据块数量
%c Total file nodes in file system 文件系统的inode总数
%d Free file nodes in file system 空闲inode数量
%f Free blocks in file system 可用的block数量
%C Security context in SELinux selinux 安全上下文
%i File System ID in hex 分区ID(十六进制)
%l Maximum length of filenames 分区文件名最大长度
%n File name 文件名
%s Block size (for faster transfers) 块大小(都是系统block的大小)
%S Fundamental block size (for block counts) 基本块大小(都是系统block的大小)
%t Type in hex 文件系统类型(格式化的类型,十六进制)
%T Type in human readable form 文件系统类型(格式化的类型,可读形式)

stat -f -c "%a %b %c %d %f %C %i %l %n %s %S %t %T" file

在Linux中,没有文件创建时间的概念,只有文件的访问时间、修改时间、状态改变时间。也就是说不能知道文件的创建时间。

访问时间 读一次这个文件的内容,这个时间就会更新。 比如对这个文件使用more命令,ls、stat命令都不会修改文件的访问时间。 如果文件创建后,没有被读取过,那么访问时间=创建时间。
修改时间 对文件内容修改一次,这个时间就会更新。 比如:vi后保存文件。ls -l列出的时间就是这个时间。 但如果文件创建后就没有修改过,修改时间=创建时间。
状态改变时间 是该文件的i节点最后一次被修改的时间,文件的标签如属性、用户、用户组、权限、内容等被改变时,就会更改 通过chmod,chown,vi命令更改一次文件属性,这个时间就会更新。 如果文件创建后,状态就没有改变过,那么状态改变时间=创建时间。
例:
  1. [root@MLibra ~]# stat master.zip
  2. 文件:"master.zip"
  3. 大小:8282580 块:16184 IO 块:4096 普通文件
  4. 设备:803h/2051d Inode67346562 硬链接:1
  5. 权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
  6. 最近访问:2016-10-30 18:00:01.674229648 +0800
  7. 最近更改:2016-10-21 16:30:29.082236970 +0800
  8. 最近改动:2016-10-21 16:30:29.082236970 +0800
  9. 创建时间:-
  1. [root@MLibra ~]# stat master.zip
  2. File: 'master.zip'
  3. Size: 8282580 Blocks: 16184 IO Block: 4096 regular file
  4. Device: 803h/2051d Inode: 67346562 Links: 1
  5. Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
  6. Access: 2016-10-30 18:00:01.674229648 +0800
  7. Modify: 2016-10-21 16:30:29.082236970 +0800
  8. Change: 2016-10-21 16:30:29.082236970 +0800
  9. Birth: -

stat显示出inode的内容–inode包含文件的元信息,具体来说有以下内容:

  • 文件的字节数
  • 文件拥有者的User ID
  • 文件的Group ID
  • 文件的读、写、执行权限
  • 文件的时间戳,共有三个
  • 链接数,即有多少文件名指向这个inode
  • 文件数据block的位置
  • IO Block:逻辑块的大小为4096个字节
  • Blocks:物理最小块是512,而IO Block为4096,所以这里就占用了16184个物理块的意思

出现3个类型的时间,分别是Access,Modify,Change。
下面我们就对这3个时间进行详细解释下:

  • access time:表示我们最后一次访问(仅仅是访问,没有改动)文件的时间
  • modify time:表示我们最后一次修改文件的时间
  • change time:表示我们最后一次对文件属性改变的时间,包括权限,大小,属性等等。

有以下三种情况:

  • 当我们仅仅只是读取文件时,access time 改变,而modify,change time 不会改变
  • 当修改文件时,access,modify,change time 都会跟着改变
  • 当修改文件属性时,change time 改变,而access,modify time 不变。

除了可以通过stat来查看文件的mtime,ctime,atime等属性,也可以通过ls命令来查看,具体如下:

  • ls -lc filename 列出文件的 ctime (最后更改时间)
  • ls -lu filename 列出文件的 atime(最后存取时间)
  • ls -l filename 列出文件的 mtime (最后修改时间)

首先,我们来看下stat情况

如图所示,会出现3个类型的时间,分别是Access,Modify,Change。下面我们就对这3个时间进行详细解释下。

access time:表示我们最后一次访问(仅仅是访问,没有改动)文件的时间

modify time:表示我们最后一次修改文件的时间

change time:表示我们最后一次对文件属性改变的时间,包括权限,大小,属性等等。

例如,我们使用cat命令来查看下此文件:

此时,文件的access 时间修改了。access时间我们可以理解为我们最后一次访问文件的时间。

我们再来看下change时间的情况:

此时,当我们修改文件的属性等时,change 的时间会随着改变,但modify时间是不变的,因为我们没有对文件内容进行修改。

下面我们接着看modify时间的情况:

此时我们可以看到,3个时间点都发生了改变。

由此,我们可以知道

1,当我们仅仅只是读取文件时,access time 改变,而modify,change time 不会改变

2,当修改文件时,access,modify,change time 都会跟着改变

3,当修改文件属性时,change time 改变,而access,modify time 不变。

那么,我们使用的命令ls -l显示的又是什么时间呢?touch修改文件的时间戳的时候修改的是什么时间呢?

那我们来继续看下。

ls -l 显示的时间


此时,对比能够发现,ls -l显示的时间是文件的修改时间。

最后,touch修改的又是什么时间呢?

首先我们看下touch的man帮助即可帮我找到答案。

不信的话我们再试试看。(不过呢,如果不加参数的话,是所有的时间都会修改掉的。上图中的man touch中有个-a参数,只修改access时间。这个加参数的大家可以自己试下。)

我们直接touch b.txt吧,因为b.txt文件已经存在了,不会新建而是修改其时间戳。

至此,我想大家应该搞明白了这几个命令的时间问题了。

posted @ 2017-02-19 22:28  MLibra  阅读(528)  评论(0编辑  收藏  举报