查最近24小时内变动的文件,应依需求区分mtime(内容修改)、ctime(元数据变更)或审计日志溯源:用-mmin -1440精准定位内容变更,-cmin -1440替代-ctime -1避免取整误差,权限/属主变更须结合auditd规则监控并ausearch溯源。

查“最近24小时内变动的文件”,首先要分清你关心的是内容修改、权限变更,还是其他元数据变化——find 的 -mtime、-mmin、-cmin 行为完全不同,混用会漏掉关键线索。
查内容修改:用 -mtime -1 或 -mmin -1440
如果你要找配置被改、日志新增、脚本更新这类「文件内容实际变过」的文件,必须盯住 mtime(即 st_mtime):
-
-mtime -1表示「过去 24 小时内」,计算基于 24 小时整数倍,快、兼容性好,适合定时任务或大目录初筛 -
-mmin -1440是等价但更精确的写法,直接按分钟算,无取整偏差,适合应急响应或需要锁定到某小时内的场景 - 路径别加尾部
/,比如写find /var/log,而不是find /var/log/,否则某些系统因权限问题静默失败 - 通配符必须引起来:
-name "*.conf",否则 shell 提前展开,find收不到通配逻辑
查权限或属主变更:别用 -ctime -1,改用 -cmin -1440
-ctime 看起来像“创建时间”,其实是 inode 元数据最后变更时间,但 -ctime -1 有严重缺陷:
- 它不是按真实时间比较,而是向下取整到最近一个 24 小时周期,可能漏掉刚过 24 小时的 chmod 操作
- 一次
chown、chmod、甚至mv同分区都会触发ctime更新,但你无法区分是改权限还是改属主 - 真正该用的是
-cmin -1440:精度到分钟,无取整误差,且明确对应 inode 变更发生的真实时间点 - 如果只想看权限变更(排除
chown),find本身做不到过滤,得先用-cmin -1440缩小范围,再人工用stat对比Access字段
查谁在什么时候改了权限:find 做不到,得上 auditd
find 只能给你一份静态快照,告诉你“哪些文件的 ctime 新了”,但无法回答“谁、在哪、用什么命令改的”。这时候必须启用审计子系统:
- 加规则监控关键系统调用:
sudo auditctl -a always,exit -F arch=b64 -S chmod,fchmod,fchmodat -k perm_change - 查最近 24 小时记录:
sudo ausearch -k perm_change --start today | aureport -f -i - 输出包含进程名、UID、完整路径、精确时间戳,还能看到是否通过
sudo执行,这是find永远给不了的溯源能力 - 注意:
auditd默认不开启,需确认服务已启动(sudo systemctl status auditd)且规则持久化(写入/etc/audit/rules.d/)
执行前必做两件事:屏蔽干扰 + 验证路径
直接跑 find / -mmin -1440 很容易被淹没或出错:
- 大量
Permission denied会刷屏,把真实结果挤走,加2>/dev/null屏蔽:find / -mmin -1440 2>/dev/null - 虚拟文件系统(
/proc、/sys、/dev)不能真扫,用-prune排除:find / \( -path "/proc" -o -path "/sys" -o -path "/dev" \) -prune -o -mmin -1440 -print - 永远先
-print,再-delete或-exec;尤其涉及rm或chmod时,多一步验证能避免删错 -
-prune必须紧跟路径条件,且整个排除逻辑要用\( \)包裹,顺序错一点就失效——它不会报错,只会返回空,让人误以为“没东西”
真正容易被忽略的,是 -mtime 和 -mmin 在不同文件系统上的行为差异,以及 -prune 的语法硬约束:括号、空格、顺序,错一个,结果就不可靠。


















