题外话:今天在杭州找了一天的房子,才明白我的工资在杭州快连房租都付不起了。而且找了一天还没找到合适的。找的好累,本来都不想写了。但是作为一名菜鸡,我明白落下一天,就会落下第二天。坚持坚持,我要成为大菜鸡。
今天说的是linux中的ctime,mtime,atime这三种time。
一贯的拿来主义:
转载地址:http://blog.csdn.net/wodeqingtian1234/article/details/53975744
转载地址:http://www.linuxidc.com/Linux/2015-02/113358.htm
要去看原文的可以点击上面链接,比我排版好多了。毕竟我菜鸡。
简称 | 全称 | 含义 |
ctime | change time | 是在写入文件、更改所有者、权限或链接设置时随 Inode 的内容更改而更改,即文件状态最后一次被改变的时间。 |
atime | access time | 是在读取文件或者执行文件时更改,即文件最后一次被读取的时间。 |
mtime | modified time | 是在写入文件时随文件内容的更改而更改,是指文件内容最后一次被修改的时间 |
这几推荐大家记住英文名字,反正前几遍我试图去记含义,记了就忘,并没有效果。还是记英文好
这里我讲的很简单,想要详细的话,可以去 看原文,推荐。
注意:
1、修改是文本本身的内容发生了变化(mtime)
改变是文件的索引节点发生了改变(ctime)
2、如果修改了文件内容,则同时更新ctime和mtime
3、如果只改变了文件索引节点,比如修改权限,则只是改变了ctime
4、如果使用ext3文件系统的时候,在mount的时候使用了noatime参数则不会更新atime的信息,即访问文件之后atime不会被修改,而这个不代表真实情况
小知识:这三个 time stamp 都放在 inode 中。若mtime,atime修改, inode 就一定会改,相应的inode改了,那ctime 也就跟着要改了,之所以在mount option中使用 noatime, 就是不想 file system 做太多的修改, 从而改善读取性能.
抄完别人的,就在抄下别人的代码:
[root@VM_157_218_centos ~]# stat test_shell_dir #这里看的是一个目录
File: `test_shell_dir' #一切皆文件嘛
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fc01h/64513d Inode: 491535 Links: 2
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-07-08 22:12:01.000000000 +0800 #atime
Modify: 2017-07-08 22:46:40.000000000 +0800 #mtime
Change: 2017-07-08 22:46:40.000000000 +0800 #ctime
#我ls下这个目录,理论上我看了目录(目录也是文件哎。)里面的内容呀,但是它的atime没有变。
[root@VM_157_218_centos ~]# ls test_shell_dir
2017_8_9.log creat_log_file.sh test.sh
[root@VM_157_218_centos ~]# stat test_shell_dir
File: `test_shell_dir'
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fc01h/64513d Inode: 491535 Links: 2
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-07-08 22:12:01.000000000 +0800
Modify: 2017-07-08 22:46:40.000000000 +0800
Change: 2017-07-08 22:46:40.000000000 +0800
#你看什么都没变。
#cd 进这个目录,在退出来看看改变了什么。
[root@VM_157_218_centos ~]# stat test_shell_dir
File: `test_shell_dir'
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fc01h/64513d Inode: 491535 Links: 2
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-07-08 22:12:01.000000000 +0800
Modify: 2017-07-08 22:46:40.000000000 +0800
Change: 2017-07-08 22:46:40.000000000 +0800
#可以看到的是,也什么没变。再去试试修改目录名字看看。
[root@VM_157_218_centos ~]# mv test_shell_dir/ test_dir
[root@VM_157_218_centos ~]# stat test_dir/
File: `test_dir/'
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fc01h/64513d Inode: 491535 Links: 2
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-07-08 22:12:01.000000000 +0800
Modify: 2017-07-08 22:46:40.000000000 +0800
Change: 2017-07-09 22:08:01.000000000 +0800 #改变了哦
#这次changetime ,即ctime改变了。
注意:下面是是抄袭别人的一段话,作者 :阮一峰
看过他的python笔记,挺喜欢他的。、、题外话
一、inode是什么?
理解inode,要从文件储存说起。
文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。
操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。
文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。
每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。
二、inode的内容
文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。
inode包含文件的元信息,具体来说有以下内容:
文件的字节数。
文件拥有者的User ID。
文件的Group ID。
文件的读、写、执行权限。
文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
链接数,即有多少文件名指向这个inode。
文件数据block的位置。
目录中保存着它底下文件的文件名以及该文件名对应的inode号。当然目录也是文件,也有自己的inode。
#
其实我个人理解有谬误。
真实的应该是下面抄袭别人中的说明部分,更容易理解。
atime:Access time,是在读取文件或者执行文件时更改,即文件最后一次被读取的时间。
说明: st_atime
Time when file data was last accessed. Changed by the
following functions: creat(), mknod(), pipe(),
utime(2), and read(2).
mtime:Modified time,是在写入文件时随文件内容的更改而更改,是指文件内容最后一次被修改的时间。
说明: st_mtime
Time when data was last modified. Changed by the fol-
lowing functions: creat(), mknod(), pipe(), utime(),
and write(2).
ctime:Change time,是在写入文件、更改所有者、权限或链接设置时随 Inode 的内容更改而更改,即文件状态最后一次被改变的时间。
说明: st_ctime
Time when file status was last changed. Changed by the
following functions: chmod(), chown(), creat(),
link(2), mknod(), pipe(), unlink(2), utime(), and
write().
不扯了,我得说下的场景。
假如在/tmp下有一大堆文件,上万个,而且文件名都是随机生成的(或者说,我比较笨,根本发现不了规律)。比方说:
[root@VM_157_218_centos test_dir]# cat creat_log_file.sh
#!/bash/bin
PATH=$PATH
for((i=1;i<=10;i++))
do
x=$(date +%N)
touch /tmp/$x
done
[root@VM_157_218_centos test_dir]# cd /tmp;ls
388680818 392158387 395707895 399200377 402962619 ap_1004.pid hsperfdata_root sagent.pid
390383802 393864715 397425697 401034062 404776968 cvm_init.log net_affinity.log setRps.log
现在我先把今天生成的文件删了,或者说,你想把除今天以外的文件删了。这里使用find就十分不错。
下面看看find命令
查找文件更新日时在距现在时刻二天以内的文件
find ./ -mtime -2
查找文件更新日时在距现在时刻二天以上的文件
find ./ -mtime +2
查找文件更新日时在距现在时刻一天以上二天以内的文件
find ./ -mtime 2
查找文件更新日时在距现在时刻二分以内的文件
find ./ -mmin -2
查找文件更新日时在距现在时刻二分以上的文件
find ./ -mmin +2
查找文件更新日时在距现在时刻一分以上二分以内的文件
find ./ -mmin 2
查找文件更新时间比文件abc的内容更新时间新的文件
find ./ -newer abc
查找文件访问时间比文件abc的内容更新时间新的文件
find ./ -anewer abc
#########################格式#########################
find ./ -type f -mtime -1 -print -exec rm -rf {} \;
(1) "." 表示从当前目录开始递归查找
(2) “ -name '*.exe' "根据名称来查找,要查找所有以.exe结尾的文件夹或者文件
(3) " -type f "查找的类型为文件
(4) "-print" 输出查找的文件目录名
(5) 最主要的是是-exec了,-exec选项后边跟着一个所要执行的命令,表示将find出来的文件或目录执行该命令。
exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{},一个空格和一个,最后是一个分号
我要删除今天的文件:
[root@VM_157_218_centos tmp]# find ./ -type f -mtime -1 -print -exec rm -rf {} \;
./395707895
./397425697
./392158387
./399200377
./388680818
./401034062
./402962619
./404776968
./.PATH
./390383802
./393864715
[root@VM_157_218_centos tmp]# ls
ap_1004.pid cvm_init.log hsperfdata_root net_affinity.log sagent.pid setRps.log
#删了
睡觉