- A+
[20210625]find -mtime +N N -N时间问题补充.txt
--//昨天find -mtime的测试,为了更好的说明问题,做一个例子:
--//还有另外一个原因确定是否包括等于的情况.
$ mkdir aaa
$ cd aaa
$ seq -3 1 2 | xargs -IQ date "+%Y%m%d%H%M.%S" --date='2 days ago Q seconds ago' | xargs -IQ touch -t Q Q ; find . -mtime +1 -exec ls -ltr {} +; echo ====== ; ls -ltr
-rw-r--r-- 1 oracle oinstall 0 Jun 23 15:53 ./202106231553.13
-rw-r--r-- 1 oracle oinstall 0 Jun 23 15:53 ./202106231553.14
======
total 0
-rw-r--r-- 1 oracle oinstall 0 2021-06-23 15:53:13 202106231553.13
-rw-r--r-- 1 oracle oinstall 0 2021-06-23 15:53:14 202106231553.14
-rw-r--r-- 1 oracle oinstall 0 2021-06-23 15:53:15 202106231553.15
-rw-r--r-- 1 oracle oinstall 0 2021-06-23 15:53:16 202106231553.16
-rw-r--r-- 1 oracle oinstall 0 2021-06-23 15:53:17 202106231553.17
-rw-r--r-- 1 oracle oinstall 0 2021-06-23 15:53:18 202106231553.18
--//看出分界点了吗?执行时的当前时间是2021-06-25 15:53:16.我测试多次find -mtime +1 都是显示2条,注意执行前删除前面测试的文件.
--//实际上比较准确的时间点是 小于 当前时间-2天-1秒.
$ rm -f 2021*
--//记住每次测试前执行它,后面不再提及
$ seq -3 1 2 | xargs -IQ date "+%Y%m%d%H%M.%S" --date='2 days ago Q seconds ago' | xargs -IQ touch -t Q Q ; find . -mtime 1 -exec ls -ltr {} +; echo ====== ; ls -ltr
--//注意执行的是find . -mtime 1
-rw-r--r-- 1 oracle oinstall 0 Jun 23 15:55 ./202106231555.52
-rw-r--r-- 1 oracle oinstall 0 Jun 23 15:55 ./202106231555.53
-rw-r--r-- 1 oracle oinstall 0 Jun 23 15:55 ./202106231555.54
-rw-r--r-- 1 oracle oinstall 0 Jun 23 15:55 ./202106231555.55
======
total 0
-rw-r--r-- 1 oracle oinstall 0 2021-06-23 15:55:50 202106231555.50
-rw-r--r-- 1 oracle oinstall 0 2021-06-23 15:55:51 202106231555.51
-rw-r--r-- 1 oracle oinstall 0 2021-06-23 15:55:52 202106231555.52
-rw-r--r-- 1 oracle oinstall 0 2021-06-23 15:55:53 202106231555.53
-rw-r--r-- 1 oracle oinstall 0 2021-06-23 15:55:54 202106231555.54
-rw-r--r-- 1 oracle oinstall 0 2021-06-23 15:55:55 202106231555.55
--//当前时间是2021-06-25 15:55:53,
--//find . -mtime 1 的查询时间范围的下边界是 大于等于 当前时间-2天-1秒.
$ seq -3 1 2 | xargs -IQ date "+%Y%m%d%H%M.%S" --date='1 days ago Q seconds ago' | xargs -IQ touch -t Q Q ; find . -mtime 1 -exec ls -ltr {} +; echo ====== ; ls -ltr ; rm -f 202106*
-rw-r--r-- 1 oracle oinstall 0 Jun 24 16:12 ./202106241612.50
-rw-r--r-- 1 oracle oinstall 0 Jun 24 16:12 ./202106241612.51
======
total 0
-rw-r--r-- 1 oracle oinstall 0 2021-06-24 16:12:50 202106241612.50
-rw-r--r-- 1 oracle oinstall 0 2021-06-24 16:12:51 202106241612.51
-rw-r--r-- 1 oracle oinstall 0 2021-06-24 16:12:52 202106241612.52
-rw-r--r-- 1 oracle oinstall 0 2021-06-24 16:12:53 202106241612.53
-rw-r--r-- 1 oracle oinstall 0 2021-06-24 16:12:54 202106241612.54
-rw-r--r-- 1 oracle oinstall 0 2021-06-24 16:12:55 202106241612.55
--//当前时间是2021-06-25 16:12:53
--//find . -mtime 1 的查询时间范围的上边界是 小于 当前时间-1天-1秒.
$ seq -3 1 2 | xargs -IQ date "+%Y%m%d%H%M.%S" --date='1 days ago Q seconds ago' | xargs -IQ touch -t Q Q ; find . -mtime -1 -exec ls -ltr {} +; echo ====== ; ls -ltr ; rm -f 202106*
-rw-r--r-- 1 oracle oinstall 0 Jun 24 16:19 ./202106241619.35
-rw-r--r-- 1 oracle oinstall 0 Jun 24 16:19 ./202106241619.36
-rw-r--r-- 1 oracle oinstall 0 Jun 24 16:19 ./202106241619.37
-rw-r--r-- 1 oracle oinstall 0 Jun 24 16:19 ./202106241619.38
.:
total 0
-rw-r--r-- 1 oracle oinstall 0 Jun 24 16:19 202106241619.33
-rw-r--r-- 1 oracle oinstall 0 Jun 24 16:19 202106241619.34
-rw-r--r-- 1 oracle oinstall 0 Jun 24 16:19 202106241619.35
-rw-r--r-- 1 oracle oinstall 0 Jun 24 16:19 202106241619.36
-rw-r--r-- 1 oracle oinstall 0 Jun 24 16:19 202106241619.37
-rw-r--r-- 1 oracle oinstall 0 Jun 24 16:19 202106241619.38
======
total 0
-rw-r--r-- 1 oracle oinstall 0 2021-06-24 16:19:33 202106241619.33
-rw-r--r-- 1 oracle oinstall 0 2021-06-24 16:19:34 202106241619.34
-rw-r--r-- 1 oracle oinstall 0 2021-06-24 16:19:35 202106241619.35
-rw-r--r-- 1 oracle oinstall 0 2021-06-24 16:19:36 202106241619.36
-rw-r--r-- 1 oracle oinstall 0 2021-06-24 16:19:37 202106241619.37
-rw-r--r-- 1 oracle oinstall 0 2021-06-24 16:19:38 202106241619.38
--//感觉输出有点奇怪,实际存在一个目录.在作怪,因为. 在find . -mtime -1 的范围包括.目录,改写如下:
$ seq -3 1 2 | xargs -IQ date "+%Y%m%d%H%M.%S" --date='1 days ago Q seconds ago' | xargs -IQ touch -t Q Q ; find . -name "202106*" -mtime -1 -exec ls -ltr {} +; echo ====== ; ls -ltr ; rm -f 202106*
-rw-r--r-- 1 oracle oinstall 0 Jun 24 16:22 ./202106241622.54
-rw-r--r-- 1 oracle oinstall 0 Jun 24 16:22 ./202106241622.55
-rw-r--r-- 1 oracle oinstall 0 Jun 24 16:22 ./202106241622.56
-rw-r--r-- 1 oracle oinstall 0 Jun 24 16:22 ./202106241622.57
======
total 0
-rw-r--r-- 1 oracle oinstall 0 2021-06-24 16:22:52 202106241622.52
-rw-r--r-- 1 oracle oinstall 0 2021-06-24 16:22:53 202106241622.53
-rw-r--r-- 1 oracle oinstall 0 2021-06-24 16:22:54 202106241622.54
-rw-r--r-- 1 oracle oinstall 0 2021-06-24 16:22:55 202106241622.55
-rw-r--r-- 1 oracle oinstall 0 2021-06-24 16:22:56 202106241622.56
-rw-r--r-- 1 oracle oinstall 0 2021-06-24 16:22:57 202106241622.57
--//当前时间是2021-06-25 16:22:55.
--//find . -mtime -1 的查询时间范围是 大于等于 当前时间-1天-1秒.
总结:
1.感觉测试在细节上浪费时间.
2.总之清楚一点,如果不关心后面的秒数.
find -mtime +N 表示 小于 <当前时间-(N+1)天 -1秒.
find -mtime +1 表示 在 >=当前时间-(N+1)天-1秒 <当前时间-(N)天-1秒 之间.
find -mtime -1 表示 大于 >=当前时间-(N)天-1秒.
--//我感打赌许多人在这个问题的理解上都是错误的.