为什么“find -mtime”对于具有不同时区的文件不能按预期工作?

为什么“find -mtime”对于具有不同时区的文件不能按预期工作?

我的服务器上有一些几个月前的文件,但它们无法被find -mtime 7搜索到。

当我用 列出它们时ls -l,它们看起来非常正常:

-rw-r--r-- 1 root root    347253 Jun 12 16:26 pedia_main.2010-06-12-04-25-02.sql.gz
-rw-r--r-- 1 root root 490144578 Nov 24 16:26 gsmforum_main.2010-11-24-04-25-02.sql.gz

顶部文件对于“find . -mtime 1”是不可见的,但底部文件是可见的。

我几乎要撞墙了,想弄明白为什么。我尝试了一些随机的东西,遇到了ls --full-time命令。这表明这两者在某种程度上有点不同

-rw-r--r-- 1 root root    347253 2010-06-12 16:26:20.000000000 +0400 pedia_main.2010-06-12-04-25-02.sql.gz
-rw-r--r-- 1 root root 490144578 2010-11-24 16:26:12.000000000 +0300 gsmforum_main.2010-11-24-04-25-02.sql.gz

日期似乎没问题。但其中一个带有+0400时区,另一个带有+0300。为什么find找不到带有 的日期+0400

操作系统是CentOS5.5 Final 包含最新更新,ls版本为(GNU coreutils) 5.97

另外,我不明白这个文件的“时区”存储在哪里。索引节点似乎没有任何额外的属性来存储它们。服务器上的文件系统是ext4

答案1

时区问题可能只是一个障眼法。

find . -mtime 7

应该可以找到刚好是 7 天前的文件(“7” 表示介于 7.000 到 7.999 天之间,大概是这个意思,“旧” 表示“自上次修改以来”)。如果你想要超过 7 天前的文件,根据你的第一个文件的日期(2010 年 6 月)判断,你可以尝试

find . -mtime +7

我同意你关于时区看起来很奇怪的说法,但我认为这是可以解释的。 man stat很明显,存储了一个 time_t,正如 Sean R 在下面所说的那样。这样ls做是为了将其显示为本地时间,并且在这样做时考虑到本地夏令时惯例,这是足够好的。

我的系统是一样的:文件时间恰好在 3 月至 10 月之间时,显示 +0100 时区,而文件时间恰好在 10 月至 3 月之间时,显示 +0000 时区,这并不是因为它存储在文件系统中,而是因为时区文件告诉我的系统,在 6 月,当我触摸该文件时,我会在我认为是早上 8 点的时间进行操作,而不是如果是冬天的话应该是早上 7 点。 ls在显示恰好在夏季的时间时,可以很好地将其显示为夏季的时间,仅此而已。

如果您在输出中找到任何ls不是根据当地惯例的夏季或冬季的时区,那么我错了 - 但我在我的系统上找不到任何时区。

答案2

使用 find 时,-mtime 以 24 小时为周期,因此

-mtime 0 or -mtime -1 mean today
-mtime 3 would mean 3 days old
-mtime +1 means greater than one day old 
-mtime -7 means less than 7 days old

答案3

除了以上这些,我还经常使用以下方法:

find -mtime -7 -daystart 

这告诉 find 查找从今天开始最多 (7 * 24) 小时的文件。

答案4

进一步解释一下时区部分(“mtime”讨论由其他评论处理)...

日期和时间以自 1970 年 1 月 1 日午夜(UTC)以来的秒数形式存储在文件中。这意味着它们没有关联的时区。然后,程序使用 中的系统时区设置(/etc/timezone除非被“TZ”环境变量覆盖)以本地时区显示该时间:

chats:/tmp$ touch foo
chats:/tmp$ ls -l foo
-rw-r--r-- 1 jafo jafo 0 Dec  1 06:14 foo
chats:/tmp$ TZ=GMT ls -l foo
-rw-r--r-- 1 jafo jafo 0 Dec  1 13:14 foo
chats:/tmp$

请注意,最后一行显示下午 1:14,而上面的输出中,我使用默认时区美国山地时间 (GMT-0700),显示上午 6:14。区别在于,第二个“ls”我将 TZ 环境变量设置为 GMT。

您可能还想使用“stat”来检查与文件相关的所有时间/日期。

相关内容