答案是-mtime +365,因其表示文件修改时间早于当前时间减365天整(即存在超一年),而-mtime 365仅匹配恰好第365天窗口内文件,-mtime -365则为近一年内文件,语义不符。

直接用 find 查 -mtime +365 就行,但必须加 -type f,否则会把目录也列出来;+365 不是“365天前”,而是“已存在满365天以上”的文件——这正好对应“超过一年”。
为什么是 -mtime +365 而不是 -mtime 365 或 -mtime -365
-mtime n 的语义是“最后修改时间距今恰好 n 天”,但实际计算按 24 小时整数倍向下取整,有舍入误差;+365 表示“大于 365 天”,即文件修改时间 ≤ 当前时间减去 365 天整(不含当天),这才是“超过一年”的准确表达。-365 是“小于 365 天”,即近一年内改过的文件,完全反了。
-
find . -mtime 365:只匹配修改时间落在第 365 天那个 24 小时窗口内的文件(极窄,基本找不到) -
find . -mtime -365:匹配最近 365 天内(含今天)改过的所有文件 -
find . -mtime +365:匹配修改时间 ≤2025-07-07(当前日期减 365 天)的文件 —— 这才是你要的
必须加 -type f,否则结果不可信
find / -mtime +365 会把目录也列出来,而目录的 mtime 是它内容变更(如增删子项)的时间,不是“文件没动过”的含义。归档清理场景下,你真正想删的是日志文件、压缩包等普通文件,不是空目录或配置目录本身。
- 漏掉
-type f→ 结果混杂目录,rm时可能误删整个/var/log/nginx目录 - 加了
-type f才保证每个结果都是可安全处理的文件实体 - 如果还想排除符号链接(避免跟随跳转到不该碰的位置),再加
-not -type l
权限和路径范围决定你能看到什么
不加 sudo,find / 会在 /var/log、/etc 等目录报 Permission denied,直接跳过——你以为没旧文件,其实是没权限看。但盲目加 sudo 又可能扫到不该碰的系统路径。
- 优先限定路径:
sudo find /var/log -type f -mtime +365(比扫全盘快且安全) - 若业务日志在
/opt/app/logs,就明确写进去,别用/ -
2>/dev/null可屏蔽报错,但会掩盖真实权限问题——调试阶段建议先去掉,确认路径是否真能进 -
find对软链接默认不跟随,所以/var/log/syslog.1.gz这类硬链接或归档文件不受影响
mtime 够用,但归档日志更推荐用 ctime 或 stat 核验
对已压缩的日志(如 app.log.20240601.tar.gz),mtime 是打包完成时间,一般就是归档时间,可用。但如果有人用 touch 改过时间戳,或者文件被移动过,ctime(元数据变更时间)反而更稳定——它记录的是文件被创建、重命名、chmod 等操作的时间。
- 查
ctime:用-ctime +365,语义同mtime - 不确定时,挑一个结果跑
stat filename,看Modify:和Change:两行哪个更符合你的“归档时间”预期 - 不要用
atime(访问时间):现代系统常禁用或延迟更新,不可靠











