CLI AI

安全删除 Linux 上超过 30 天的文件

2026-05-01

简短答案是 find /var/log/app -type f -mtime +30 -delete。完整答案是:先不带 -delete 跑一次,因为这条命令出错时会连整个目录一起带走。下面是安全的顺序,用你平时说话的方式表达。

1. 先告诉我哪些会被删掉

clai
$ clai 列出 /var/log/app 里超过 30 天的文件,什么都别删→ find /var/log/app -type f -mtime +30 -printf '%TY-%Tm-%Td  %p\n'2026-06-01  /var/log/app/app-june.log2026-07-10  /var/log/app/app-july.log

find 不带动作时只会打印。先读一遍这个列表再决定是否信任它——大多数人跳过的正是这一步。

2. 实际能腾出多少空间

clai
$ clai 这些旧文件能释放多少磁盘空间→ find /var/log/app -type f -mtime +30 -printf '%s\n' | awk '{s+=$1} END {printf "%.1f KB in %d files\n", s/1024, NR}'6.0 KB in 2 files

如果答案只有几 KB,那你的磁盘问题不在这里,到此为止即可。

3. 现在删除

clai
$ clai 删掉那些超过 30 天的文件→ find /var/log/app -type f -mtime +30 -delete

-delete 成功时什么都不打印。这种安静是正常的。

4. 只处理 .log,只处理第一层

clai
$ clai 只删 /var/log/app 里超过 30 天的 .log 文件,不要进子目录→ find /var/log/app -maxdepth 1 -type f -name '*.log' -mtime +30 -delete

-maxdepth 1 能防止清理任务一路走进某个挂载的卷里。

5. 按日历日期,而不是「N 天前」

clai
$ clai 找出 2026 年 7 月 1 日之前修改过的文件→ find /var/log/app -type f ! -newermt '2026-07-01' -printf '%TY-%Tm-%Td  %p\n'2026-05-01  /var/log/app/old.txt2026-06-01  /var/log/app/app-june.log

当分界线是发版日期而不是滚动窗口时很有用。

6. 清掉剩下的空目录

clai
$ clai 删除 /var/log/app 下面留下来的空文件夹→ find /var/log/app -mindepth 1 -type d -empty -delete

-mindepth 1 能避免 find 把你指定的那个目录本身也删掉。

坑

  • -delete 必须放在最后。 find 从左到右求值表达式,所以 find . -delete -mtime +30 会在检查时间之前就把一切删光。这是本文里代价最高的一个笔误。
  • -mtime +30 意味着至少 31 天。 find 按整 24 小时截断,而 +30 表示严格大于 30,所以 30.5 天前修改的文件不会被匹配。
  • 不要用 -atime。 多数系统以 relatime 挂载,访问时间最多一天更新一次。请按修改时间(-mtime)或状态变更时间(-ctime)计算。

相关问题

为什么 find -delete 删的比预期多? 几乎总是参数顺序问题,见第一个坑。另外 -delete 隐含 -depth,会改变目录树的遍历方式。

怎么每晚自动执行? 把验证过的命令用绝对路径写进 cron:0 3 * * * find /var/log/app -type f -mtime +30 -delete。先手动跑一遍——cron 的环境不同,而且出错时围观的人少得多。

在 macOS 上能用吗? 可以,BSD 版 find 支持 -mtime、-delete 和 -maxdepth。-printf 是 GNU 独有的,macOS 上请用 -print。

另请参阅

不确定命令是否安全?CliAI 会在执行前把每条命令标记为 SAFE、CAUTION 或 DANGER,破坏性操作必须手动输入确认。一行命令安装。