清理空目录是什么
上传目录、解压残渣、脚本临时目录会留下大量空目录,逐个删费时且容易漏。find 用 -type d -empty 找出空目录,-delete 隐含 -depth 从最深处向上处理,一次就把级联变空的目录树修剪干净。
基本信息
| 场景 | 批量删除空目录,含删除子项后变空的父目录 |
|---|---|
| 工具 | find -type d -empty -print 与 -delete |
| 语义 | -delete 隐含 -depth,自底向上遍历 |
| 注意 | 只含隐藏文件的目录不算空 |
典型使用场景
- 整理上传目录:用户上传后留下的空目录批量修剪
- 清理解压残渣:包内目录结构在内容迁走后批量清理
- 脚本收尾:任务结束后清掉自己产生的空目录
- 定期维护:配合计划任务每周清理一次业务数据目录
- 目录结构规整:迁移或同步前清掉空目录,减少对象数量与元数据开销
常用示例
常用示例
find /data/uploads -type d -empty -print # 先列出清单
find /data/uploads -type d -empty -delete # 确认后再删除
find /data -xdev -type d -empty -not -path '*/.git/*' -delete
find /data -type d -empty -mtime +7 -delete # 只删 7 天前的空目录
find /data -type d -empty -exec rmdir {} \; # 用 rmdir 保留非空即拒的保护参数作用
| 写法 | 作用 | 注意 |
|---|---|---|
| -type d -empty | 只匹配空目录 | 对目录而言空即无任何条目 |
| -delete | 删除匹配项 | 隐含 -depth,自底向上 |
| -mindepth 1 | 排除起始目录本身 | 起点过宽时的必要保护 |
| -xdev | 不跨越挂载点 | 避免误伤挂载进来的目录树 |
| -mtime +7 | 只处理较旧目录 | 保护刚创建的空目录 |
只含 .gitkeep、.git 这类占位内容的目录不算空,find 不会命中,通常正是期望的保护效果。
用 -exec rmdir {} \; 代替 -delete 可以保留 rmdir 的非空即拒保护,代价是必须配合 -depth 才能自底向上删除。
删除前把命中清单重定向归档,事后可以核对到底删掉了哪些目录,复盘时有据可查。
清理业务目录选低峰期执行,并用时间门槛跳过刚创建、稍后才会写入内容的目录。
不要在挂载点集合上直接跑批量删除,加 -xdev 防止跨越挂载边界误伤其他文件系统。