用 find 的 -mtime / -mmin 精准筛文件,别再靠 ls 肉眼扫

举报
yd_257918670 发表于 2026/10/29 06:28:00 2026/10/29
【摘要】 运维和备份脚本里,最常见的需求之一是:「找出最近 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。

小坑

  1. 跨文件系统要加 -xdev,避免误扫到挂载点里的大目录。
  2. -delete 有深度限制:删除目录时先删内容;复杂场景更稳妥是 -print0 | xargs -0 rm。
  3. 时间边界以「整天」为单位时容易误解:若要「日历上的昨天」,用 -newermt 'yesterday 00:00' ! -newermt 'today 00:00' 比单纯 -mtime 1 更精确。
  4. 网络盘 / 容器卷 上 mtime 可能被同步工具改写,脚本里加日志核对更安心。

小结

把「最近改过什么」和「太久没动该清什么」交给 find -mtime/-mmin,比管道里堆 ls、awk、日期字符串更不容易出错。写进 cron 或备份脚本前,先 -print 看一遍名单,确认范围再 -delete。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。