之前研究wal日志清理的副产物,wal日志名被修改后文件的哪个时间会变?应该如何删除?由此整理一下Linux中atime、mtime、ctime的区别,以及find的常见用法。
一、 Linux中的各类时间
1. 各类时间的定义
Linux中有三种用于文件时间戳的概念:
-
atime(访问时间):表示文件最后一次被读取的时间。每次对文件的读取都会更新atime。这意味着即使只是查看文件的内容,atime也会被更新。在许多情况下,特别是对于大量读取操作的文件系统,会关闭或限制atime更新以提高性能。
-
mtime(修改时间):表示文件内容最后一次被修改的时间。当文件的内容发生变化时,mtime会被更新。这包括文件的写入、追加、截断等操作。
-
ctime(更改时间):表示文件元数据(比如权限、所有者、链接数等)最后一次被修改的时间。当文件的元数据发生变化时,ctime会被更新。这包括文件的文件名、权限、链接数、所有者变更等操作。
2. 如何查看这些时间
① stat命令
-bash-4.2$ stat tmp.html File: ‘tmp.html’Size: 31284 Blocks: 64 IO Block: 4096 regular file
Device: f900h/63744d Inode: 67752138 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 501/postgres) Gid: ( 502/ dba)
Access: 2023-04-05 14:25:13.759000000 +0800
Modify: 2023-04-05 14:24:52.767000000 +0800
Change: 2023-04-05 14:24:52.767000000 +0800
通常来说,mtime变化ctime都会跟着变,因为修改文件内容后,其大小等元数据都会变化。如果直接echo修改文件,atime不会变;如果通过vi等方式直接访问文件修改,则atime会变。
-bash-4.2$ echo "111" >> tmp.html
-bash-4.2$
-bash-4.2$ stat tmp.html File: ‘tmp.html’Size: 31288 Blocks: 64 IO Block: 4096 regular file
Device: f900h/63744d Inode: 67752138 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 501/postgres) Gid: ( 502/ dba)
Access: 2023-04-05 14:25:13.759000000 +0800
Modify: 2024-02-22 15:39:44.592000000 +0800
Change: 2024-02-22 15:39:44.592000000 +0800
-bash-4.2$ vi tmp.html
-bash-4.2$
-bash-4.2$ stat tmp.html File: ‘tmp.html’Size: 31284 Blocks: 64 IO Block: 4096 regular file
Device: f900h/63744d Inode: 69354682 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 501/postgres) Gid: ( 502/ dba)
Access: 2024-02-22 15:40:22.778000000 +0800
Modify: 2024-02-22 15:40:22.778000000 +0800
Change: 2024-02-22 15:40:22.780000000 +0800Birth: -
修改元数据,例如文件名,ctime会变mtime不变。
-bash-4.2$ mv tmp.html tmp_02.html
-bash-4.2$
-bash-4.2$ stat tmp_02.html File: ‘tmp_02.html’Size: 31284 Blocks: 64 IO Block: 4096 regular file
Device: f900h/63744d Inode: 69354682 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 501/postgres) Gid: ( 502/ dba)
Access: 2024-02-22 15:40:22.778000000 +0800
Modify: 2024-02-22 15:40:22.778000000 +0800
Change: 2024-02-22 15:49:19.370000000 +0800Birth: -
访问一下文件,只有atime会变
-bash-4.2$ less tmp_02.html
-bash-4.2$
-bash-4.2$ stat tmp_02.html File: ‘tmp_02.html’Size: 31284 Blocks: 64 IO Block: 4096 regular file
Device: f900h/63744d Inode: 69354682 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 501/postgres) Gid: ( 502/ dba)
Access: 2024-02-22 15:52:46.589000000 +0800
Modify: 2024-02-22 15:40:22.778000000 +0800
Change: 2024-02-22 15:49:19.370000000 +0800Birth: -
② ls命令
ls命令利用不同的参数可以看到不同的时间
- mtime:ls -l filename
- atime:ls -lu filename
- ctime:ls -lc filename
-bash-4.2$ ls -l tmp_02.html
-rw-r--r-- 1 postgres dba 31284 Feb 22 15:40 tmp_02.html
-bash-4.2$
-bash-4.2$ ls -lu tmp_02.html
-rw-r--r-- 1 postgres dba 31284 Feb 22 15:52 tmp_02.html
-bash-4.2$
-bash-4.2$ ls -lc tmp_02.html
-rw-r--r-- 1 postgres dba 31284 Feb 22 15:49 tmp_02.html
这里默认只到分钟,更详细的可以用time-style参数调整显示格式
-bash-4.2$ ls -l tmp_02.html --time-style=+"%Y-%m-%d %H:%M:%S"
-rw-r--r-- 1 postgres dba 31284 2024-02-22 15:40:22 tmp_02.html
-bash-4.2$
-bash-4.2$ ls -lu tmp_02.html --time-style=+"%Y-%m-%d %H:%M:%S"
-rw-r--r-- 1 postgres dba 31284 2024-02-22 15:52:46 tmp_02.html
-bash-4.2$
-bash-4.2$ ls -lc tmp_02.html --time-style=+"%Y-%m-%d %H:%M:%S"
-rw-r--r-- 1 postgres dba 31284 2024-02-22 15:49:19 tmp_02.html
3. wal日志应该用哪个时间判断删除
以实际的wal日志为例,可以看到被重命名后仅ctime会改变。一段时间后其文件内容也被修改,mtime和ctime同时变化。因此,为了避免误删除,用ctime来作为条件相对而言是最安全的,也可以mtime和ctime两个条件都加上。
二、 find命令的常用参数
1. 按时间查找
就是前面提到过的3个时间
- -atime n:查找在 n*24小时(前/内/时)被访问过的文件
- -ctime n:查找在 n*24小时(前/内/时)元数据被修改的文件
- -mtime n:查找在 n*24小时(前/内/时)内容被修改过的文件
还可以按分钟
- -amin n:查找在 n分钟(前/内/时)被访问过的文件
- -cmin n:查找在 n分钟(前/内/时)元数据被修改的文件
- -mmin n:查找在 n分钟(前/内/时)内容被修改过的文件
这个 n 前面可以带 + - 或者不带符号,例如:
- -mtime -5:[5*24小时前时间点,当前时间点)
- -mtime 5:[6*24小时前时间点,5*24小时前时间点]
- -mtime +5: (−∞,5*24小时前时间点),特别注意这里是开区间
之所以特地强调24小时,因为它不是从0:00算起,而是按执行命令那刻的时间计算。
测试验证
[root@SAKURA_VPS test]# touch -t 05130700 2018-0513-0700
[root@SAKURA_VPS test]# touch -t 05120700 2018-0512-0700
[root@SAKURA_VPS test]# touch -t 05110700 2018-0511-0700
[root@SAKURA_VPS test]# touch -t 05100700 2018-0510-0700
[root@SAKURA_VPS test]# touch -t 05090700 2018-0509-0700
[root@SAKURA_VPS test]# touch -t 05080700 2018-0508-0700
[root@SAKURA_VPS test]# touch -t 05070700 2018-0507-0700
[root@SAKURA_VPS test]# touch -t 05060700 2018-0506-0700
[root@SAKURA_VPS test]# ls -l
合計 0
-rw-r--r-- 1 root root 0 5月 6 07:00 2018-0506-0700
-rw-r--r-- 1 root root 0 5月 7 07:00 2018-0507-0700
-rw-r--r-- 1 root root 0 5月 8 07:00 2018-0508-0700
-rw-r--r-- 1 root root 0 5月 9 07:00 2018-0509-0700
-rw-r--r-- 1 root root 0 5月 10 07:00 2018-0510-0700
-rw-r--r-- 1 root root 0 5月 11 07:00 2018-0511-0700
-rw-r--r-- 1 root root 0 5月 12 07:00 2018-0512-0700
-rw-r--r-- 1 root root 0 5月 13 07:00 2018-0513-0700
[root@SAKURA_VPS test]#
[root@SAKURA_VPS test]# date
2018年 5月 13日 日曜日 22:29:42 JST[root@SAKURA_VPS test]# find . -mtime -5
.
./2018-0513-0700
./2018-0512-0700
./2018-0511-0700
./2018-0510-0700
./2018-0509-0700
[root@SAKURA_VPS test]# find . -mtime 5
./2018-0508-0700
[root@SAKURA_VPS test]# find . -mtime +5
./2018-0507-0700
./2018-0506-0700
未完待续~
参考:
ctime、mtime、atime-阿里云开发者社区
Linux find 命令 | 菜鸟教程
【Linux】find コマンド【図解】 | 100%レンタルサーバーを使いこなすサイト