用 find 的 -mtime / -mmin 精准筛文件,别再靠 ls 肉眼扫
【摘要】 运维和备份脚本里,最常见的需求之一是:「找出最近 N 天改过的文件」或「清理超过 30 天的临时目录」。很多人习惯 ls -lt | head,目录一大就慢、还容易漏。find 自带按修改时间过滤的选项,稳定、可脚本化。 核心参数-mtime n:按「整天」算。n 是整数:-mtime -1:过去 24 小时内改过的-mtime 0:从现在往回不到 24 小时(和 -1 接近,细节见 man...
运维和备份脚本里,最常见的需求之一是:「找出最近 N 天改过的文件」或「清理超过 30 天的临时目录」。很多人习惯 ls -lt | head,目录一大就慢、还容易漏。find 自带按修改时间过滤的选项,稳定、可脚本化。
核心参数
-mtime n:按「整天」算。n是整数:-mtime -1:过去 24 小时内改过的-mtime 0:从现在往回不到 24 小时(和-1接近,细节见 man)-mtime +7:7 整天之前改过的(超过约 7×24 小时)
-mmin n:按「分钟」算,适合更细的窗口:-mmin -30:过去 30 分钟内改过的-mmin +60:超过 60 分钟没改过的
注意:+ / - / 无符号 三种语义不同。无符号 n 表示「刚好落在第 n 个时间桶」,实际写脚本几乎总用 + 或 -。
几个实用例子
找出当前目录下最近一天改过的普通文件:
find . -type f -mtime -1 -print
清理 /var/tmp 里超过 14 天的文件(先 dry-run,确认后再删):
find /var/tmp -type f -mtime +14 -print
# 确认无误后再:
# find /var/tmp -type f -mtime +14 -delete
备份脚本里只打包「昨天到现在」改动的配置:
find /etc -type f -mtime -1 \
! -path '*/.git/*' \
-print0 | tar --null -T - -czf /backup/etc-$(date +%F).tgz
按分钟抓「刚写入的日志片段」:
find /var/log/myapp -type f -name '*.log' -mmin -5 -ls
和 atime / ctime 的区别
mtime:内容修改时间(写文件、截断都会更新)ctime:元数据变化时间(权限、属主变了也会动;内容改也会动)atime:访问时间(很多发行版默认 relatime,读不一定更新)
日常「这个文件内容有没有变过」用 -mtime / -mmin 即可。权限排查才看 -ctime。
小坑
- 跨文件系统要加
-xdev,避免误扫到挂载点里的大目录。 -delete有深度限制:删除目录时先删内容;复杂场景更稳妥是-print0 | xargs -0 rm。- 时间边界以「整天」为单位时容易误解:若要「日历上的昨天」,用
-newermt 'yesterday 00:00' ! -newermt 'today 00:00'比单纯-mtime 1更精确。 - 网络盘 / 容器卷 上 mtime 可能被同步工具改写,脚本里加日志核对更安心。
小结
把「最近改过什么」和「太久没动该清什么」交给 find -mtime/-mmin,比管道里堆 ls、awk、日期字符串更不容易出错。写进 cron 或备份脚本前,先 -print 看一遍名单,确认范围再 -delete。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)