You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用GNU find筛选今日之前创建的文件不符合预期,求排查

问题:GNU find筛选今日之前文件结果不符合预期

我尝试使用GNU find筛选log目录下(最大深度为1)创建于今日之前、名称匹配BACKUP*OK的文件,但执行以下两条命令:

$ find log/ -maxdepth 1 ! -newermt today -name "BACKUP*OK"
log/BACKUP_copro-20230504_OK
log/BACKUP_distrib-20230503_OK
log/BACKUP_distrib-20230504_OK
$ find log/ -maxdepth 1 -daystart ! -newermt today -name "BACKUP*OK"
log/BACKUP_copro-20230504_OK
log/BACKUP_distrib-20230503_OK
log/BACKUP_distrib-20230504_OK

得到的结果包含了日期为20230504的文件,但我预期仅得到log/BACKUP_distrib-20230503_OK,请问我哪里操作有误?


原因与修正方案

核心问题:-newermt today的逻辑偏差

! -newermt today 实际匹配的是修改时间不晚于今日00:00:00的文件,也就是修改时间≤当日零点的文件。如果那些命名为20230504的文件,实际修改时间恰好是当日零点(或更早),就会被纳入结果。

-daystart参数仅让时间比较以当日零点为起点,但不改变-newermt today的匹配逻辑,因此加不加都无法排除修改时间等于当日零点的文件。

正确的筛选命令

要精准筛选**今日之前(完全排除当日创建/修改的文件)**的目标文件,可使用以下两种方式:

  1. 使用-mtime +0(推荐,更直观)

    find log/ -maxdepth 1 -mtime +0 -name "BACKUP*OK"
    

    -mtime +0表示匹配修改时间超过24小时的文件,即至少是昨天同一时间点之前创建的文件,完全排除今日的文件。

  2. 明确指定时间边界
    如果需要基于当日零点严格排除,可指定更精确的时间阈值:

    find log/ -maxdepth 1 ! -newermt "$(date +%Y-%m-%d) 00:00:01" -name "BACKUP*OK"
    

    通过指定当日00:00:01作为边界,确保所有修改时间在当日零点及之后的文件都被排除。

额外检查点

若执行上述命令仍不符合预期,建议检查目标文件的实际修改时间,确认文件名中的日期与实际修改时间是否一致:

ls -l log/BACKUP_copro-20230504_OK

内容的提问来源于stack exchange,提问作者SebMa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 19:04:54