stat命令用于显示文件系统和文件的源或者说是属性信息;
2、stat命令的使用参数
-f,--file-system 不显示文件本身的信息,显示文件所在文件系统的信息
-Z,--context 打印SElinux安全上下文信息
-L,--dereference 显示符号链接
-c,--format=格式 自定义输出格式,结尾有换行
-t,--terse 简洁模式,只显示摘要信息
格式参数:
有效的文件格式序列(不使用 --file-system):
%a 八进制权限
%A 用可读性较好的方式输出权限
%b 计算已分配块数(参见%B)
%B 以字节为单位输出%b 所报告的每个块的大小
%C SELinux 安全环境字符串
%d 十进制设备编号
%D 十六进制设备编号
%f 十六进制原始模式
%F 文件类型
%g 文件的属组ID
%G 文件的属组组名
%h 硬链接数量
%i Inode 编号
%n 文件名
%N 如果对象是一个符号链接,显示引用到的其它文件名
%o I/O 块大小
%s 总计大小,以字节为单位
%t 十六进制主设备类型
%T 十六进制子设备类型
%u 文件的属主ID
%U 文件的属主用户名
%x 上次访问时间
%X 从UNIX 元年起计的上次访问时间
%y 上次修改时间
%Y 从UNIX 元年起计的上次修改时间
%z 上次更改时间
%Z 从UNIX 元年起计的上次更改时间
有效的文件系统格式序列:
%a 非超级用户可用的剩余块数
%b 文件系统的总数据块数
%c 文件系统中文件节点总数
%d 文件系统中空闲文件节点数
%f 文件系统中空闲块数
%C SELinux 安全环境字符串
%i 十六进制文件系统ID
%I 允许的文件名最大长度
%n 文件名
%s 块大小(用于快速传输)
%S 基本块大小(用于块计数)
%t 十六进制类型描述
%T 可读性较好的类型描述
3、使用实例
(1)查看文件信息
[root@localhost command_test]# ls test_dir test.txt [root@localhost command_test]# ll test.txt -rw-r--r--. 1 root root 0 8月 30 19:36 test.txt [root@localhost command_test]# stat test.txt File: "test.txt" Size: 0 Blocks: 0 IO Block: 4096 普通空文件 Device: 802h/2050d Inode: 26 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2018-08-30 19:36:08.439981055 +0800 Modify: 2018-08-30 19:36:08.439981055 +0800 Change: 2018-08-30 19:36:08.439981055 +0800 [root@localhost command_test]# stat -f test.txt File: "test.txt" ID: 4f2b948b696e2979 Namelen: 255 Type: ext2/ext3 Block size: 4096 Fundamental block size: 4096 Blocks: Total: 503956 Free: 494998 Available: 469398 Inodes: Total: 128000 Free: 127970 [root@localhost command_test]#
(2)stat格式化输出 都要使用-c 参数
[root@localhost command_test]# stat -c %y test.txt 2018-08-30 19:36:08.439981055 +0800 [root@localhost command_test]#
(3)细说stat查询文件后展示的信息项
1 [root@localhost command_test]# stat test.txt 2 File: "test.txt" 3 Size: 0 Blocks: 0 IO Block: 4096 普通空文件 4 Device: 802h/2050d Inode: 26 Links: 1 5 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) 6 Access: 2018-08-30 19:36:08.439981055 +0800 7 Modify: 2018-08-30 19:36:08.439981055 +0800 8 Change: 2018-08-30 19:36:08.439981055 +0800 9 [root@localhost command_test]#
简单的介绍一下stat命令显示出来的文件其他信息:
- File:显示文件名
- Size:显示文件大小
- Blocks:文件使用的数据块总数
- IO Block:一次IO块传递大小
- regular file:文件类型(常规文件)
- Device:设备编号
- Inode:Inode号 (这个参数可以查找阮一峰的博客有详细讲解,而且讲的特别好http://www.ruanyifeng.com/blog/2011/12/inode.html)
- Links:链接数
- Access:文件的权限
- Gid、Uid:文件所有权的Gid和Uid,
三个时间戳
- Access: 2018-08-30 19:36:08.439981055 +0800 #访问时间,当文件被访问时修改这个时间
- Modify: 2018-08-30 19:36:08.439981055 +0800 #修改时间,当文件数据内容被修改是修改这个时间
- Change: 2018-08-30 19:36:08.439981055 +0800 #状态修改时间,当文件的状态被更改时修改这个时间,例如一些状态参数-链接数,大小,权限等等
(4)验证上述三个时间戳字段
下面开始验证对文件操作影响到时间的变化,注意一开始三个时间是一样。
第一步,(针对Access-访问时间)验证查看文件对文件时间的影响,使用cat命令查看文件,结果发现文件的访问时间已经改变,如下图所示
第二步,(针对Modify-修改时间)对文件进行写入操作,可使用echo命令对文件写入内容,请注意查看,因为插入一行内容导致Modify和Change都改变了,为什么呢?
你可以注意看下文件的Size、Blocks等属性都改变了,因为插入文件内容影响了文件的大小,Blocks也会被更新,所以导致Change时间也改变了!
第三步,(针对Change-状态修改时间),前文已经说过,可修改文件状态影响该时间,这里使用chmod命令改变文件权限来验证Change时间的改变,
可查看到当前文件访问权限的改变会影响到Change时间的变化!
当然我们也可以不经过上述操作直接对时间进行更改操作
touch命令
我们都知道touch命令是用来创建文件的,其实它的用法还有一个,就是修改文件的时间戳。
用法:
-a 或–time=atime或–time=access或–time=use 只更改访问时间。
-m 或–time=mtime或–time=modify 只更改修改时间
-d、-t 使用指定字符串的时间,而非当前时间
我们来试一试:
观察上图,咱们使用touch -a file 命令更新文件的访问时间,也会导致Change时间更新,这是由于文件状态已经发生改变,所以也会影响Change时间!
再来,试一试
观察上图,咱们使用touch -m file 更新文件的Modify时间,也会导致Change时间更新,为什么呢?
由于我们每次更新的时候都会更新文件的inode信息,也即文件的状态信息发生改版,所以Change时间也会随着更新!
咱们再试试使用touch -d、-t参数修改文件时间
-d 更改指定日期时间,而不是当前系统时间,可设定多种格式。
-t 以 [[CC]YY]MMDDhhmm[.ss] 的格式指定新时间戳的日期和时间,相关信息如下。
CC 指定年份的前两位数字。
YY 指定年份的后两位数字。
MM 指定一年的哪一月, 1-12。
DD 指定一年的哪一天, 1-31。
hh 指定一天中的哪一个小时, 0-23。
mm 指定一小时的哪一分钟, 0-59。
观察上面图片可看出使用命令touch -d更改时间,但是只更改到Access时间,Modify时间,而Change时间则更新为系统当前最新时间。
同理可使用touch -t 更改文件格式,如下图