改变和修改的区别

改变和修改之间的区别在于是改变文件的属性还是改变文件的内容。如果有人说 chmod a-w myfile(删除所有用户对文件 myfile 的写权限),那么这叫改变;如果有人说 echo foo >> myfile(将文件 foo 的内容追加输出到文件 myfile 中。>> 叫追加输出重定向符号),那么这叫修改。改变是文件的索引节点发生了改变,修改是文本的内容发生了变化。

ctime

change time(也有人说是 status time),改变时间,变更时间,最后一次改变文件的时间。指的是文件的元数据,状态最后被变更的时间。改变文件的元数据,即:属性。例如,更改文件的 inode、权限、所属组等。

ctime 文件的权限、拥有者、所属的组、链接数发生改变时的时间。当然当内容改变时也会随之改变(即inode内容发生改变和Block内容

发生改变时)

ctime 是在写入文件、更改所有者、权限或链接设置时随 Inode 的内容更改而更改的。

更改文件的内容就一定会更改 mtime 和 ctime,mtime 改变,ctime 一定会改变,但是文件的 ctime 可能会在 mtime 未发生变化时更改,也就是说 ctime 改变,mtime 未必改变。例如,文件的权限更改,但是文件内容没有变化的情况下,ctime 改变,mtime 不改变。

atime、mtime、ctime 都放在 inode 中,若 mtime,atime 修改,inode 就一定改变,既然 inode 改变了,那 ctime 也就跟着要改变了。

mtime

modify time,modified time,modification time,修改时间,最后一次修改文件的时间,指的是文件内容最后被修改的时间。
mtime 是在写入文件时随文件内容的更改而更改。

比如用 vi 编辑时就会被改变。(也就是Block的内容)

atime

access time,访问时间,文件最后一次被访问的时间,或者叫文件最后被读取的时间,因此阅读一个文件会更新它的访问时间

atime 读取文件或者执行文件时会更改。

atime 不一定在访问文件之后被修改,因为使用 ext3 文件系统的时候,如果在 mount(挂载) 的时候使用了 noatime 参数那么就不会更新 atime 的信息。我们知道 atime、mtime、ctime 都放在 inode 中,若 mtime,atime 修改,inode 就一定改变,既然 inode 改变了,那 ctime 也就跟着要改变了。之所以在 mount option 中使用 noatime, 就是不想 file system 做太多的修改,从而改善读取效率。

查看文件时间

(一)使用命令 stat 可以查看文件的所有时间属性,如下所示:

[root@htlwk0001host ~]# stat httpd
  文件:httpd
  大小:92        	块:0          IO 块:4096   目录
设备:fd01h/64769d	Inode:34185529    硬链接:5
权限:(0755/drwxr-xr-x)  Uid:(    0/    root)   Gid:(    0/    root)
最近访问:2021-04-23 22:05:47.104315111 +0800 atime
最近更改:2020-08-15 12:39:32.000000000 +0800 mtime
最近改动:2020-08-23 14:15:51.903328888 +0800 ctime
创建时间:-

(二)使用命令 ls 查看文件的时间属性

ls -l file,查看文件修改时间:

[root@htlwk0001host ~]# ls -l install.php
-rw-r--r-- 1 root root 1295 823 2020 install.php

2020年8月23日,这是文件的 mtime。

ls -lc file,查看文件状态改动时间:

[root@htlwk0001host ~]# ls -lc install.php
-rw-r--r-- 1 root root 1295 823 2020 install.php

ls -lu file,查看文件访问时间:

[root@htlwk0001host ~]# ls -lu install.php
-rw-r--r-- 1 root root 1295 823 2020 install.php

ls -l --time=atime,查看文件访问时间:

[root@htlwk0001host ~]# ls -l --time=atime
总用量 1284196
-rw-r--r-- 1 root  root        4023 1227 14:58 4946737_test.dpqyw.com_nginx.zip
-rw-r--r-- 1 root  root       15670 116 13:21 aa4.jpg
-rw-r--r-- 1 root  root        2151 116 13:21 Demo1.class

ls -l --time=ctime 查看文件的改变时间:

[root@htlwk0001host ~]# ls -l --time=ctime
总用量 1284196
-rw-r--r-- 1 root  root        4023 1227 14:58 4946737_test.dpqyw.com_nginx.zip
-rw-r--r-- 1 root  root       15670 116 13:21 aa4.jpg
-rw-r--r-- 1 root  root        2151 116 13:21 Demo1.class
-rw-r--r-- 1 root  root        2227 116 13:21 Demo1.java
drwxr-xr-x 5 root  root          92 823 2020 httpd

关于 relatime

如果每次访问文件都会更新 atime,这是很耗时的,尤其在 web 服务器上,大量用户只是访问 html 页面,完全没有必要修改 atime。从kernel 2.6.29 开始,文件系统默认集成了一个 relatime 的属性,这样就不会每次访问文件时都改变 atime,而是满足一定条件才会更改 atime。

可能是因为在文件读操作很频繁的系统中,atime 更新所带来的开销很大,所以很多 SA(系统管理员)都在挂装文件系统的时候使用noatime 属性来停止更新 atime。但是有些程序需要根据 atime 进行一些判断和操作,所以 Linux 就推出了一个relatime特性。使用这个特性来挂装文件系统后,只有当 mtime 比 atime 更新或者上次访问时间是在 1 天前才会更新 atime。使用方法就是通过 mount -o relatime /dir 来挂装目录。

Logo

更多推荐