以下以FreeBSD为例,其他类Unix系统都差不多,特殊的地方我会提示一下。
先上示例:
hu@mm:~ % echo "eeee" > tmp.txt
hu@mm:~ % stat tmp.txt
95 2327483 -rw-r--r-- 1 hu wheel 4657102 5 "May 29 08:11:02 2014" "May 29 08:11:12 2014" "May 29 08:11:12 2014" "May 29 08:11:02 2014" 32768 8 0 tmp.txt
请注意上面的结果,有四个时间,比windows多了一个。
第一个是:atime,也就是访问时间(Access Time);
第二个是:mtime,也就是修改时间(Modify Time);
第三个是:ctime,注意这不是Create Time,而是Change Time,等下再详细说。
上面这三个是Linux/Unix的标准,类Unix系统都有这三个时间。
最后一个目前大多数系统没有这个属性,我用过的系统中,仅FreeBSD的UFS和ZFS支持,叫做birthtime,顾名思义,就是Birth(产生)的时间,这才是“创建时间”。
atime和birthtime好理解,ctime和mtime会混淆:一句话:文件内容的改变,是mtime负责;文件整体属性的变,是ctime负责。再举一个例子:一个杯子,装水还是装酒,装100毫升还是200毫升,这是mtime负责;这个杯子放桌子上还是凳子上,归张三所有还是归李四所有,那是ctime负责。
我们接着上面继续来做几个练习:
1、只改变访问时间(atime)
hu@mm:~ % cat tmp.txt > /dev/null
hu@mm:~ % stat tmp.txt
95 2327483 -rw-r--r-- 1 hu wheel 4657102 5 "May 29 08:23:05 2014" "May 29 08:11:12 2014" "May 29 08:11:12 2014" "May 29 08:11:02 2014" 32768 8 0 tmp.txt
对照上面的示例,会发现仅atime改变了,其他三个都没变。
atime用的是最多的,无论是手动打开,或者是用脚本打开,甚至是自己写程序打开,都会触发atime改变。实际上,atime是跟系统调用有关的,除非你自己跟磁��打交道,否则就会触发atime。
2、只改变修改时间(mtime):
这个……咳!咳!……好吧,我承认,我没有办法只改变mtime而不改变ctime!
原因嘛!导致mtime改变的几个系统调用,都在改变ctime的系统周用列表中。可以用man 2 stat来查看这部分内容:
st_mtim Time when file data last modified. Changed by the mkdir(2),
mkfifo(2), mknod(2), utimes(2), write(2) and writev(2) sys-
tem calls.
st_ctim Time when file status was last changed (inode data modifica-
tion). Changed by the chflags(2), chmod(2), chown(2),
creat(2), link(2), mkdir(2), mkfifo(2), mknod(2), rename(2),
rmdir(2), symlink(2), truncate(2), unlink(2), utimes(2),
write(2) and writev(2) system calls.
3、同时改变ctime和mtime:
这个好像比较简单,再对tmp.txt添加一些字符就行了,注意这没有打开文件:
hu@mm:~ % echo "eeee" > tmp.txt
hu@mm:~ % stat tmp.txt
95 2327483 -rw-r--r-- 1 hu wheel 4686015 5 "May 29 08:23:05 2014" "May 29 08:37:48 2014" "May 29 08:37:48 2014" "May 29 08:11:02 2014" 32768 8 0 tmp.txt
4、单独改变ctime:
这个方法就比较多了,实际上,你仔细对照一个上面的man stat,就可以发现点什么。
好吧,我们就用最简单的chmod来看一下:
hu@mm:~ % chmod 777 tmp.txt
hu@mm:~ % stat tmp.txt
95 2327483 -rwxrwxrwx 1 hu wheel 4686015 5 "May 29 08:23:05 2014" "May 29 08:37:48 2014" "May 29 08:41:15 2014" "May 29 08:11:02 2014" 32768 8 0 tmp.txt
注意link也会改变ctime。
5、单独改变birthtime:
对于birthtime,你还是从了吧,至少这辈子不要改了,改了就是来世,成了另外一个文件,真想改的话也简单,复制一个再删除就成,已经脱胎换骨了。
6、两个说明
(1)在磁盘IO繁忙的系统中,比如数据库服务器、web系统,atime会拖累整个系统,并且在这些系统中我们并不关心atime,所以在这些系统中,最好把atime关闭掉,这样可以提升系统的一些性能。
方法就是在/etc/fstab中,添加noatime参数,当然也可以手动mount的时候添加这个参数:
cat /etc/fstab
# Device Mountpoint FStype Options Dump Pass#
/dev/ada0p2 / ufs rw 1 1
/dev/ada0p3 none swap sw 0 0
/dev/ada0p4 /home ufs rw,notime 2 2
(2)在复制的时候,windows和类Unix系统有所不同,windows保留了修改时间,而Unix下,一切都是新的,atime,mtime,ctime,btime,都是新的,这跟文件在磁盘上存储的方式有关,再要深究的话,就要去研究文件系统了。
该贴由hui.chen转至本版2014-11-5 17:04:59