适用场景
部署或维护结束后,你可能需要回答一个具体问题:指定目录中,某个时间段内有哪些普通文件的修改时间发生变化?本文使用 GNU find 生成候选文件清单,适合 Ubuntu、Debian 等安装 GNU Findutils 的 Linux 系统。
这份清单可以缩小配置核查范围,但不能证明是谁修改了文件,也不能列出已经删除的文件。它依据当前文件系统记录查询,不是完整的操作审计。教程先在独立目录建立边界样本,再把相同方法用于真实目录。
原理:明确时间类型和边界
文件的修改时间通常表示内容最后修改的时间。它与访问时间、元数据变更时间不同,元数据变更时间也不等于文件创建时间。复制程序、恢复程序或手工调整时间都可能影响最终记录,因此时间命中只表示值得进一步检查。
GNU find 的时间比较使用严格大于关系。下面组合两个条件,得到“晚于开始时间,且不晚于结束时间”的范围,也就是开始时刻不包含、结束时刻包含。GNU 的时间比较说明明确指出,时间相等时,较新判断为假。
准备工作
准备 Bash 终端,以及当前用户可以读取的练习位置。示例采用协调世界时 UTC,时间窗口是 2026 年 11 月 1 日九点至十点。真实排查时应替换为维护记录对应的日期和时区,不能把北京时间直接当作 UTC 输入。
先确认命令版本和终端显示时间:
find --version
date -u '+%Y-%m-%d %H:%M:%S UTC'
版本输出应标明 GNU find。其他实现可能没有相同参数。本文没有要求修改系统时间,也不需要管理员权限。
分步骤操作
第一步:建立独立样本
lab_dir=$(mktemp -d)
touch "$lab_dir/before.txt" "$lab_dir/start.txt" "$lab_dir/middle.txt" "$lab_dir/end.txt"
TZ=UTC0 touch -d '2026-11-01 08:59:59' "$lab_dir/before.txt"
TZ=UTC0 touch -d '2026-11-01 09:00:00' "$lab_dir/start.txt"
TZ=UTC0 touch -d '2026-11-01 09:30:00' "$lab_dir/middle.txt"
TZ=UTC0 touch -d '2026-11-01 10:00:00' "$lab_dir/end.txt"
printf '练习目录:%s\n' "$lab_dir"
变量 lab_dir 保存新建目录的实际路径,不需要手工替换。四个文件分别处于窗口之前、开始边界、窗口中间和结束边界。调整的只是这些新建样本,不应把同样的调整时间命令用于业务文件。
第二步:运行时间筛选
TZ=UTC0 find "$lab_dir" -maxdepth 1 -type f \
-newermt '2026-11-01 09:00:00' \
! -newermt '2026-11-01 10:00:00' \
-printf '%f\n'
普通文件条件排除目录;最大深度限制本次只查看样本目录这一层。第一个时间条件要求修改时间严格晚于九点,感叹号对第二个条件取反,排除严格晚于十点的文件。参数之间默认按同时满足处理。
第三步:对照预期结果
预期命中的文件是 middle.txt 和 end.txt,显示顺序没有保证。start.txt 恰好等于开始时间,因此不会出现;end.txt 恰好等于结束时间,因此保留。先理解这个结果,再决定真实维护记录是否适合相同边界定义。
如果你的工作流程要求开始时刻也包含,应另行制定并验证包含边界的查询方式,不要把当前结果描述为两端都包含。连续时间窗口采用一致规则,能够减少交界处记录被重复计算的问题。
第四步:生成真实目录的候选清单
read -r -p '输入要检查的目录绝对路径:' target_dir
TZ=UTC0 find "$target_dir" -type f \
-newermt '2026-11-01 09:00:00' \
! -newermt '2026-11-01 10:00:00' \
-printf '%T+\t%p\n'
target_dir 应输入已获准检查的真实目录。这里去掉深度限制,以便递归检查子目录,并同时显示修改时间和路径。运行前还要把两处示例时间改成实际窗口。默认不跟随遇到的符号链接,避免无意扩展搜索范围。
验证方法
先检查查询是否有权限错误,再抽查清单中几个文件,将其内容与备份或版本库比较。对于样本,可以逐个查看修改时间,确认终端展示与预设时间一致。
需要保存结果时,把输出重定向到搜索目录之外的新文件,避免报告本身进入查询范围。按行展示适合人工查看;若文件名可能带换行且结果要交给其他程序,应使用零字节分隔输出,不能直接把每一行都当作一个完整路径。Debian 的find 手册提供时间条件与输出选项的完整说明。
常见错误
把最近一天理解为今天,或把最近一小时理解为某个整点小时,都会造成结果与维护记录不一致。明确日期与时间可以减少这种歧义。另一个常见原因是日志使用本地时区,而查询固定为 UTC,导致整体偏移数小时。
权限不足时,不应隐藏错误后宣称目录没有变化。大型目录仍在写入时,扫描结果也可能随着遍历进度发生变化。需要严格一致的证据,应结合适当的快照、备份或已有审计记录。
安全与回退
真实目录查询只读取信息,不包含删除、改权限或改时间操作,因此不需要恢复业务文件。结束练习后,可以在文件管理器中核对打印出的练习目录,确认只含四个样本,再删除该目录。
不要为了让结果符合预期而调整业务文件时间,也不要直接把候选清单送入删除命令。清单的作用是提供后续核查入口,最终判断应建立在内容差异和维护记录之上。
参考资料与转载说明
本文依据上述公开资料进行中文原创整理,不是逐句翻译,也不替代厂商手册。操作前请核对自己的版本、型号和备份。
评论一下?