find -cmin -60 不等于“过去一小时新建的文件”,因为 -cmin 检查的是状态更改时间(ctime),而非创建时间(btime);chmod、chown 等操作也会更新 ctime,导致误报;ext4/XFS 传统上不暴露 btime,且无标准 find 参数支持 btime 过滤。

不能直接用 find -cmin -60 查“新创建的文件”,因为 -cmin 检查的是“状态更改时间(ctime)”,不是“创建时间(birth time)”。Linux 文件系统(如 ext4、XFS)传统上不暴露标准的创建时间(btime),-cmin 实际匹配的是权限、所有者、链接数等元数据被修改的时间——新建文件时 ctime 确实会更新,但后续 chmod/chown 等操作也会触发,导致结果混入大量非新建文件。
为什么 -cmin -60 不等于“过去一小时新建的文件”
新建一个文件时,其 ctime 和 mtime 通常同时更新,看似可行。但以下情况会让 find -cmin -60 返回误报:
- 对已有文件执行
chmod、chown、touch -c,会更新 ctime 但不改变内容或创建事实; - 某些备份/同步工具(如 rsync --archive)会保留原文件 mtime/ctime,导致旧文件“伪装”成新修改;
- ext4 默认不启用 btime 支持,
stat -c '%w' file显示 “-” 表示不可用,无法靠创建时间精准过滤。
更贴近“新文件”需求的实用方案
若目标是找内容新写入、刚被创建或首次写满的普通文件,推荐组合使用 -mmin 和类型/大小限制:
-
find /path -type f -mmin -60 ! -size 0:找过去 60 分钟内内容被修改过且非空的普通文件(覆盖大多数新建+写入场景); - 加
-newermt "1 hour ago"(GNU find)更清晰:find /path -type f -newermt "1 hour ago" ! -size 0; - 排除临时文件和日志干扰:
find /tmp /var/tmp -type f -mmin -60 -name "*.tmp" -o -name ".*" | grep -v "/proc\|/sys"。
若必须依赖创建时间(btime),需确认系统支持
仅限较新内核(≥5.10)+ 启用 ext4 的 inode_readahead_blks 或 XFS + statx() 支持:
- 先测试:
stat -c "%w" /etc/passwd—— 若输出类似2023-01-01 12:00:00.000000000 +0800,说明 btime 可用; - 目前无标准 find 参数直接按 btime 过滤,需借助脚本:
find /path -type f -print0 | while IFS= read -r -d '' f; do [[ "$(stat -c '%w' "$f" 2>/dev/null)" > "$(date -d '1 hour ago' '+%Y-%m-%d %H:%M:%S')" ]] && echo "$f"; done


















