如何使用Linux命令按时间筛选出最近修改过的文件?
- 内容介绍
- 文章标签
- 相关推荐
本文共计906个文字,预计阅读时间需要4分钟。
要查找最近修改的文件,可以使用`-mtime`或`-mmin`选项。注意,`-mtime`表示修改时间,而`-ctime`表示创建时间。`-ctime`并不是创建时间,而是元数据(如权限、所有权等)变更的时间。因此,`-mtime`或`-mmin`是查找内容修改的更合适选项。
为什么 -mtime 的数字含义反直觉?
-mtime 的数值不是“多少天前”,而是“距现在 n×24 小时到 (n+1)×24 小时之间”。比如:
-
-mtime -1:过去 24 小时内(0 ~ 24h)修改的文件 -
-mtime 1:恰好 24 ~ 48 小时前修改的文件 -
-mtime +1:超过 48 小时前(即 >48h)修改的文件
要找“最近 1 小时改过的”,-mtime -1 不够准——它可能漏掉刚改的文件。此时该用 -mmin -60,精度更高。
-mmin 和 -mtime 性能差异在哪?
-mmin 对每个文件都调用 stat() 读取精确秒级时间,适合小范围、高精度场景(如监控脚本);-mtime 在部分文件系统上可利用目录时间戳粗筛,速度更快。
- 扫描大目录(如
/var/log下百万级小文件)时,-mmin -1可能卡顿数秒,-mtime -1响应快得多 - 定时任务中优先选
-mtime -1,再加-maxdepth 2控制深度 - 真要分钟级,务必加
timeout 10防死锁:例如timeout 10 find /home -mmin -5 -name "*.log"
路径、权限、空格处理不对,命令就失效
参数写对只是第一步,以下三点错一个,结果就为空或报错:
- 路径末尾别加
/,比如写/var/log,别写/var/log/,否则某些系统因权限不足静默失败,不提示原因 - 通配符必须引起来:
-name "*.conf",否则 shell 提前展开成当前目录下匹配的文件名,find实际收不到通配逻辑 - 排除子目录要用
-prune配合括号和-o,例如跳过/var/cache:find /var \( -path "/var/cache" \) -prune -o -type f -mtime -1 -print;漏掉\( \)或顺序错,-prune就不生效
执行删除前,永远先 -print 验证
find /tmp -name "*.tmp" -delete 看着简洁,但一旦路径写错或通配符误扩,删的是真实数据。
- 安全流程永远分两步:先运行
find /tmp -name "*.tmp" -print,确认输出全是目标文件 - 再把
-print换成-delete或-exec rm {} \; - 如果涉及重命名或移动,建议用
-ls替代-print,能看到大小、权限、时间戳,交叉验证更稳
真正容易被忽略的,是 -mtime 和 -mmin 在不同文件系统上的行为差异,以及 -prune 必须紧跟路径条件、且需括号包裹的语法硬约束——这两点出错,不会报错,只会返回空结果,让人误以为“没文件”,其实逻辑早崩了。
本文共计906个文字,预计阅读时间需要4分钟。
要查找最近修改的文件,可以使用`-mtime`或`-mmin`选项。注意,`-mtime`表示修改时间,而`-ctime`表示创建时间。`-ctime`并不是创建时间,而是元数据(如权限、所有权等)变更的时间。因此,`-mtime`或`-mmin`是查找内容修改的更合适选项。
为什么 -mtime 的数字含义反直觉?
-mtime 的数值不是“多少天前”,而是“距现在 n×24 小时到 (n+1)×24 小时之间”。比如:
-
-mtime -1:过去 24 小时内(0 ~ 24h)修改的文件 -
-mtime 1:恰好 24 ~ 48 小时前修改的文件 -
-mtime +1:超过 48 小时前(即 >48h)修改的文件
要找“最近 1 小时改过的”,-mtime -1 不够准——它可能漏掉刚改的文件。此时该用 -mmin -60,精度更高。
-mmin 和 -mtime 性能差异在哪?
-mmin 对每个文件都调用 stat() 读取精确秒级时间,适合小范围、高精度场景(如监控脚本);-mtime 在部分文件系统上可利用目录时间戳粗筛,速度更快。
- 扫描大目录(如
/var/log下百万级小文件)时,-mmin -1可能卡顿数秒,-mtime -1响应快得多 - 定时任务中优先选
-mtime -1,再加-maxdepth 2控制深度 - 真要分钟级,务必加
timeout 10防死锁:例如timeout 10 find /home -mmin -5 -name "*.log"
路径、权限、空格处理不对,命令就失效
参数写对只是第一步,以下三点错一个,结果就为空或报错:
- 路径末尾别加
/,比如写/var/log,别写/var/log/,否则某些系统因权限不足静默失败,不提示原因 - 通配符必须引起来:
-name "*.conf",否则 shell 提前展开成当前目录下匹配的文件名,find实际收不到通配逻辑 - 排除子目录要用
-prune配合括号和-o,例如跳过/var/cache:find /var \( -path "/var/cache" \) -prune -o -type f -mtime -1 -print;漏掉\( \)或顺序错,-prune就不生效
执行删除前,永远先 -print 验证
find /tmp -name "*.tmp" -delete 看着简洁,但一旦路径写错或通配符误扩,删的是真实数据。
- 安全流程永远分两步:先运行
find /tmp -name "*.tmp" -print,确认输出全是目标文件 - 再把
-print换成-delete或-exec rm {} \; - 如果涉及重命名或移动,建议用
-ls替代-print,能看到大小、权限、时间戳,交叉验证更稳
真正容易被忽略的,是 -mtime 和 -mmin 在不同文件系统上的行为差异,以及 -prune 必须紧跟路径条件、且需括号包裹的语法硬约束——这两点出错,不会报错,只会返回空结果,让人误以为“没文件”,其实逻辑早崩了。

