Skip to content

unix文件中的ctime, mtime和atime

今天需要使用find命令来查找一些文件,需要找到15天前创建的文件。究竟该用哪个参数呢,ctime,mtime还是atime?

那就再来复习一下这三个参数具体的意义吧。

不过,在谈论这三个参数之前,你得先了解inode(索引节点)的概念,不然是说不清的。inode是干嘛用的?它是用来存储文件属性的一个数据结构,比如文件的权限,所有者,大小,指向本文件的连接数等,当然也包括文件的更新时间等信息(但不包含文件名以及文件的内容)。在表现形式上,inode是一个数字,每个文件都对应一个唯一的inode。可以使用ls命令的‘-i’参数来查看文件或目录的inode:

root@kali:/data/dbbak# ls -li
total 0
2494398 -rw-r--r-- 1 root root 0 Aug 19 20:09 test

当新建一个文件时,系统会自动分配一个inode号码。

更具体的inode信息,大家可以网上搜索一下。今天不再详细介绍。

ok,有了这些背景信息,我们可以介绍这三个参数了。

ctime

ctime是文件属性更新的时间。比如更新了文件的所有人,更改了文件的读/写/执行权限等。也可以理解为,任何对inode数据结构里的信息进行的更新都会引起ctime的更新(但下面atime的测试说明这个说法需要进一步考证)
mtime

文件内容更新的时间。

这个是最直观的。你打开文件,编辑了其中的内容,在你保存时,系统会更新文件的mtime属性。

要注意的是,更新mtime时,通常也会需要更新ctime;有时候更新ctime却未必需要更新mtime(比如为文件添加可执行权限)。

 

atime

文件最后访问时间。

每次打开一个文件时,或者使用grep/sort等命令访问文件时系统也会更新文件的atime。

那么系统更新文件的atime,意味着文件的属性发生了改变,应该同时更新ctime。但下面的测试表明不是这样的。

$ stat test
  File: ‘test’
  Size: 332           Blocks: 8          IO Block: 4096   regular file
Device: 804h/2052d    Inode: 276644      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/  acheng)   Gid: ( 1001/  acheng)
Access: 2015-08-19 22:04:02.935220201 -0400
Modify: 2015-08-19 22:04:15.391220665 -0400
Change: 2015-08-19 22:04:15.391220665 -0400
 Birth: -

$ egrep keda.io test
Domain : keda.io


$ stat test
  File: ‘test’
  Size: 332           Blocks: 8          IO Block: 4096   regular file
Device: 804h/2052d    Inode: 276644      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/  acheng)   Gid: ( 1001/  acheng)
Access: 2015-08-19 22:04:42.127221662 -0400
Modify: 2015-08-19 22:04:15.391220665 -0400
Change: 2015-08-19 22:04:15.391220665 -0400
 Birth: -
$

上面的测试说明,使用grep命令访问了文件以后,atime(Access)更新了,但ctime(Change)并没有更新。不解中 ……

同时,如果以root账户测试,grep/cat/sort等命令不更新atime。

同时查看了一下文件系统的挂载选项,发现有一个‘relatime’的选项(如果使用了noatime选项挂载,系统就不会更新文件的atime):

root@kali:~# mount | egrep ' / '
/dev/sda4 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)

mount手册这样解释relatime选项(我第一次知道这个选项,BSD类系统上没有这个):

       relatime
Update inode access times relative to modify or change time.  Access time is only updated if the previous access time was earlier  than
the  current  modify  or change time.  (Similar to noatime, but it doesn’t break mutt or other applications that need to know if a file
has been read since the last time it was modified.)

Since Linux 2.6.30, the kernel defaults to the behavior provided by this option (unless noatime was  specified),  and  the  strictatime
option  is required to obtain traditional semantics.  In addition, since Linux 2.6.30, the file’s last access time is always updated if
it is more than 1 day old.

是否是这个选项导致的呢?我现在也不知道。以后有时间再慢慢学习吧。

Avatar

专业Linux/Unix/Windows系统管理员,开源技术爱好者。对操作系统底层技术,TCP/IP协议栈以及信息系统安全有强烈兴趣。电脑技术之外,则喜欢书法,古典诗词,数码摄影和背包行。

Sidebar