使用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的匹配逻辑,因此加不加都无法排除修改时间等于当日零点的文件。
正确的筛选命令
要精准筛选**今日之前(完全排除当日创建/修改的文件)**的目标文件,可使用以下两种方式:
使用
-mtime +0(推荐,更直观)find log/ -maxdepth 1 -mtime +0 -name "BACKUP*OK"-mtime +0表示匹配修改时间超过24小时的文件,即至少是昨天同一时间点之前创建的文件,完全排除今日的文件。明确指定时间边界
如果需要基于当日零点严格排除,可指定更精确的时间阈值: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
相关产品推荐
相关产品推荐

