go 1.16+ 推荐用 filepath.walkdir 遍历文件,需调用 entry.info().modtime() 判断修改时间,仅处理普通文件,配合 dry-run 模式、权限检查和错误处理安全清理。

用 filepath.WalkDir 遍历并判断文件修改时间
Go 1.16+ 推荐用 filepath.WalkDir 替代旧的 filepath.Walk,它更轻量、不依赖 os.Stat 默认行为,且能避免 symlink 循环问题。关键点是:遍历时拿到的 fs.DirEntry 不含完整时间信息,必须对目标文件显式调用 entry.Info() 获取 os.FileInfo,再用 ModTime() 判断。
常见错误是直接对 DirEntry 调 ModTime()(它不存在),或忽略 entry.IsDir() 导致目录也被误删。
- 只对
entry.Type().IsRegular()的文件做时间判断 - 跳过目录、符号链接、设备文件等非普通文件
- 用
time.Now().Sub(info.ModTime()) > cutoffDuration判断是否超期,别用Before()手动算时间点,易出时区/夏令时偏差
删除前务必加 dry-run 模式和权限检查
自动化清理最怕误删。上线前必须支持预览模式(dry-run),即只打印将要删除的路径,不执行 os.Remove。同时,os.Remove 在遇到权限不足、只读文件、被进程占用等情况会返回具体错误,比如 "permission denied" 或 "text file busy",不能简单忽略。
- 用布尔参数控制是否真实删除,如
dryRun := true - 删除后检查
err:若为nil表示成功;若为os.IsPermission(err),说明权限不够,可尝试os.Chmod(path, 0644)后重试(仅限本地文件) - 避免在循环中用
log.Fatal—— 一个文件失败不该中断整个清理流程
os.Chtimes 不影响删除逻辑,但可能干扰时间判断
有些脚本会先用 os.Chtimes 更新文件访问/修改时间来“续命”,但这对清理逻辑本身无帮助,反而可能掩盖真实老化问题。更危险的是:如果清理程序和业务程序并发运行,Chtimes 可能使文件逃过本次扫描,下次又因时间跳跃被误删。
- 不要在清理流程里调
os.Chtimes来规避删除 - 如果业务确实需要“保活”,应在文件写入时统一设置合理
ModTime,而非后期修补 - 注意:
os.Chtimes在 Windows 上可能无法精确设置纳秒级时间,ModTime()读出的值可能与写入不一致,导致时间判断漂移
跨平台路径处理与 glob 支持需手动实现
Go 标准库不内置 glob(如 /logs/*.log),也不能直接把 shell 通配符传给 filepath.WalkDir。必须自己解析路径模式,或用第三方库如 golang.org/x/exp/filepath(实验性)或 github.com/gobwas/glob。
- 若只需简单后缀过滤,用
strings.HasSuffix(entry.Name(), ".log") - 若需多级匹配(如
**/*.tmp),建议改用filepath.Glob配合os.Stat逐个检查,但注意它不递归 - Windows 下路径分隔符为
\,但filepath.WalkDir内部已自动适配,你只需用filepath.Join拼路径,别硬写/或\
$PWD 和用户 shell 不同,相对路径会失效。务必使用绝对路径启动,或在代码里用 os.Getwd() + filepath.Abs 显式转为目标目录。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











