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命令更改一次文件属性,这个时间就会更新。 | 如果文件创建后,状态就没有改变过,那么状态改变时间=创建时间。 |
例:
[root@MLibra ~]# stat master.zip
文件:"master.zip"
大小:8282580 块:16184 IO 块:4096 普通文件
设备:803h/2051d Inode:67346562 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2016-10-30 18:00:01.674229648 +0800
最近更改:2016-10-21 16:30:29.082236970 +0800
最近改动:2016-10-21 16:30:29.082236970 +0800
创建时间:-
[root@MLibra ~]# stat master.zip
File: 'master.zip'
Size: 8282580 Blocks: 16184 IO Block: 4096 regular file
Device: 803h/2051d Inode: 67346562 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2016-10-30 18:00:01.674229648 +0800
Modify: 2016-10-21 16:30:29.082236970 +0800
Change: 2016-10-21 16:30:29.082236970 +0800
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文件已经存在了,不会新建而是修改其时间戳。
至此,我想大家应该搞明白了这几个命令的时间问题了。