rmdir
仅删除一个空目录。rm -rf
使用递归删除。
- 为什么没有
rmdir
递归选项?从逻辑上讲,当我删除一个目录,我想用rmdir
。 - 鉴于
rm
除了最简单的情况外,它都用于删除目录,为什么它rmdir
存在呢?该功能包含在rm
.
这只是历史的偶然吗?
答案1
取消目录链接也是非法的(超级用户除外)。
于是rmdir
就实施了作为一个只删除目录的小二进制文件,当时涉及删除目录内部的..
和.
,然后是目录本身。rmdir
被设计为 setuid root;它使用以下命令执行单独的权限测试access
判断是否允许真实用户删除目录。与任何 setuid root 二进制文件一样,最好保持简单且集中。
rm -r
实际上使用这个单独的二进制文件根据需要删除目录。
看来rm -r
和之间的持久差异rmdir
是这种最初差异的结果。
据推测,由于rm
很早就获得了递归删除的能力,并且rmdir
应该具有很小的职权范围,因此从未认为提供rmdir
递归删除的能力本身是有用的。
答案2
递归 rmdir 的替代方案(这会很方便)如下所示:
find . -depth -type d -exec rmdir {} \;
这只会删除空目录,如果其中一些目录不为空,则会出现许多无害的错误。
递归 rmdir 可能更聪明,当出现错误时会中止子树,而不是继续出现级联错误,但可能不会更快。
正如所指出的, rmdir 确实有这个-p
选项,但它并不完全是递归的。如上所述使用 find 的能力可能会消除为其添加递归选项的动机,因为优势很小。