rmdir 是什么
rmdir 只删除空目录,目录非空时直接报错退出,这层保护正是它存在的理由:在脚本里清理目录时,它不会像 rm -rf 那样把内容一起带走。批量清理空目录通常与 find -type d -empty 组合使用。
基本信息
| 适用平台 | Linux / Unix,GNU coreutils 实现 |
|---|---|
| 命令语法 | rmdir [选项] 目录... |
| 常用选项 | -p 自底向上删除空目录链;--ignore-fail-on-non-empty 非空时不报错;-v 输出处理过程 |
| 退出码 | 目录非空或不存在时返回非 0,脚本可据此判断 |
典型使用场景
- 清理临时目录:任务结束后删除自己创建的目录,非空会暴露出异常残留
- 删除空目录链:rmdir -p a/b/c 从最深层向上删,遇到非空目录即停
- 批量修剪:用 find 找出空目录再删,处理上传与解压产生的残渣
- 脚本防呆:比 rm -rf 更适合放进自动化流程,误删代价可控
- 保留占位目录:只含 .gitkeep 的目录不算空,正好避免误删占位结构
常用示例
常用示例
rmdir old-cache # 删除空目录,非空则报错退出
rmdir -p a/b/c # 自底向上删除空目录链
rmdir -v empty1 empty2 # 打印每个被删除的目录
find /data -type d -empty -print # 先看清单,再决定是否删除
find /data -type d -empty -delete # 批量清理(-delete 隐含 -depth)与相近命令的差别
| 命令 | 行为 | 风险 |
|---|---|---|
| rmdir 目录 | 仅删除空目录 | 低,非空即拒 |
| rmdir -p a/b/c | 自底向上删空目录链 | 中,会连带删除上层空目录 |
| find -type d -empty -delete | 删除所有匹配的空目录 | 中,范围由起点决定 |
| find ... -delete 命中文件 | 连文件一起删 | 高,与 rmdir 语义完全不同 |
| rm -rf 目录 | 删除目录及全部内容 | 最高,不可恢复 |
--ignore-fail-on-non-empty 让批量清理跳过非空目录而不报错,适合放进计划任务。
目录中只要有一个隐藏文件(如 .gitkeep、.dockerenv)就不算空,rmdir 会拒绝删除,这通常正是期望行为。
find 的 -delete 隐含 -depth,会先删子项再删目录,与 rmdir 的「非空即拒」完全不同,别把两者当等价操作。
报错信息对照
| 情形 | 提示信息 | 含义 |
|---|---|---|
| 目录非空 | Directory not empty | 保护机制生效,内容还在 |
| 目录不存在 | No such file or directory | 路径写错或已被删除 |
| 上级目录无写权限 | Permission denied | 需要提权或换操作目录 |
| 目录是挂载点 | Device or resource busy | 先 umount 再考虑删除 |
| 文件系统只读 | Read-only file system | 检查挂载选项或文件系统状态 |
GNU rm 的 -d 选项语义等同于 rmdir:只删空目录,非空直接报错,已经习惯用 rm 的人可以改用 rm -d。但 rmdir -p 那种自底向上删整条空目录链的能力,rm 没有对应写法,清理多层空壳目录仍以 rmdir -p 或 find 组合为主。