rmdir是GNU Core Utilities预装命令,仅删除空目录,失败即报错,提供安全防护;支持-p递归删空目录链,但要求路径中每个目录均为空且有写权限。

rmdir 不需要安装 —— 它是 GNU Core Utilities 的一部分,所有主流 Linux 发行版(Ubuntu、CentOS、Debian、Arch 等)默认自带。
如果你执行 rmdir --version 报“command not found”,那基本不是缺失 rmdir,而是 PATH 异常或系统严重损坏,此时不应优先考虑“安装 rmdir”,而应检查 shell 环境或重装基础包(如 coreutils)。
rmdir 只能删空目录,但为什么还值得用?
- 它不递归、不强制、不静默,失败即报错:
rmdir: failed to remove 'mydir': Directory not empty
这种“拒绝执行”本身就是安全机制 —— 防止脚本误删非空目录。 - 适合写入自动化流程中做“断言式清理”:比如确认某临时目录已被清空后才继续下一步。
- 比
rm -r更轻量,无副作用风险(不碰文件、不走递归遍历、不触发 inode 删除逻辑)。
rmdir -p 递归删除空目录链,但容易踩坑
-
rmdir -p a/b/c实际执行顺序是:先删c,再删b(仅当b此时为空),最后删a(仅当a此时为空)。 - 常见误操作:
- 当前工作目录在
a/b或a/b/c内,rmdir -p会失败(Linux 不允许删除当前所在目录) -
a下除了b还有其他子项(如a/readme.txt),则a不会被删,但b/c可能已删掉,导致目录结构残缺 - 权限不足:对任一父目录缺少写权限,整个链式删除中断
- 当前工作目录在
如何批量删当前目录下所有空子目录?
直接用 find + rmdir 最可靠:
find . -mindepth 1 -type d -empty -exec rmdir -v {} \;-
-mindepth 1避免匹配当前目录(.) -
-empty确保只选真正空的目录 -
-exec rmdir -v {} \;逐个调用,失败不影响其余 - 不要用
+替代\;:因为rmdir不支持一次传多个路径(它只接受单目录或明确列出的多个空目录)
如果想静默跳过失败(比如某些目录被其他进程占用),加 --ignore-fail-on-non-empty:
find . -mindepth 1 -type d -empty -exec rmdir --ignore-fail-on-non-empty -v {} \;rmdir 的价值不在“能删多少”,而在“拒绝删不该删的”。一旦你开始思考“怎么让 rmdir 删非空目录”,说明你真正需要的其实是 rm -r 或更精细的清理策略 —— 而不是给 rmdir 打补丁。


















