用find配合时间戳或文件快照可高效巡检新增资产文件:时间戳法通过-newer找修改时间更新的文件,快照法用comm对比路径列表精准识别新建文件,再结合cron定时执行与日志管理实现自动化审计。

用 find 配合简单脚本,可以高效完成定期巡检和记录新建资产文件的任务。核心思路是:记录上一次扫描的最新时间戳(或文件列表),每次运行时只找出该时间点之后新增的文件。
用时间戳方式标记“上次检查点”
这是最轻量、最常用的方法。脚本维护一个时间戳文件(如 /var/log/asset_last_run),每次运行前先保存当前时间,再用 find -newer 找出比该时间更新的文件。
示例脚本(保存为 check_assets.sh):
#!/bin/bash ASSET_DIR="/path/to/your/assets" TIMESTAMP_FILE="/var/log/asset_last_run" LOG_FILE="/var/log/asset_new_files_$(date +\%Y\%m\%d).log" <h1>记录本次运行时间(在查找前)</h1><p>date +%s > "$TIMESTAMP_FILE".tmp mv "$TIMESTAMP_FILE".tmp "$TIMESTAMP_FILE"</p><h1>查找自上次记录后新增的普通文件(排除目录、符号链接等)</h1><p>find "$ASSET_DIR" -type f -newer "$TIMESTAMP_FILE" 2>/dev/null | \ while IFS= read -r file; do echo "$(date '+%Y-%m-%d %H:%M:%S') $(stat -c '%U:%G %A %s' "$file") $file" done >> "$LOG_FILE"</p><h1>可选:只保留最近7天日志</h1><p>find "/var/log/asset_new<em>files</em>*.log" -mtime +7 -delete 2>/dev/null
说明:
-
-newer timestamp_file表示“修改时间晚于 timestamp_file 的修改时间”,正好对应“新建或被改动过的文件”; - 用
stat -c补充所有者、权限、大小,便于审计; - 务必加
2>/dev/null屏蔽无权限目录报错,避免干扰结果; - 时间戳文件本身必须存在且可写,首次运行前可用
touch /var/log/asset_last_run初始化。
用文件列表快照做增量比对
适合需要严格区分“新建”和“修改”的场景(比如只关心真正新增的文件,不希望因编辑已有文件而误报)。
原理:每次扫描后生成完整文件路径快照(按路径排序),下次运行时用 comm 或 diff 对比两次快照,提取仅在新快照中出现的行。
关键步骤:
- 生成快照:
find "$ASSET_DIR" -type f -printf '%P\0' | sort -z > /tmp/asset_list_new; - 对比并提取新增:
comm -13 /tmp/asset_list_old /tmp/asset_list_new | tr '\0' '\n'; - 完成后把新快照重命名为旧快照:
mv /tmp/asset_list_new /tmp/asset_list_old。
注意:-printf '%P\0' 输出相对路径+空字符,配合 sort -z 和 comm -z 可安全处理含空格、换行的文件名。
加入定时任务(cron)自动执行
将脚本设为每小时或每天运行一次:
- 赋予执行权限:
chmod +x /path/to/check_assets.sh; - 编辑 crontab:
crontab -e; - 添加一行(例如每天凌晨2点运行):
0 2 * * * /path/to/check_assets.sh; - 确保脚本中所有路径用绝对路径(尤其
ASSET_DIR和日志路径),避免 cron 环境变量缺失导致失败。
补充建议:增强健壮性与可维护性
实际部署时建议加上这些细节:
- 在脚本开头加
set -e,任一命令失败即退出; - 用
mkdir -p确保日志目录存在; - 对
find加-maxdepth N限制扫描深度,防止意外遍历过深子目录; - 若资产目录可能有大量小文件,考虑加
-mmin -60(过去1小时内)缩小范围,再配合时间戳做二次过滤; - 日志可压缩归档(如
gzip "$LOG_FILE"),节省磁盘空间。

















