Joshua Fox Asked: 2021-12-20 02:50:27 +0800 CST2021-12-20 02:50:27 +0800 CST 2021-12-20 02:50:27 +0800 CST 为什么 rmdir 不递归工作? 772 rmdir只删除一个空目录。要递归删除,rm -rf使用。 为什么没有rmdir递归选项?从逻辑上讲,当我删除目录时,我想使用rmdir. 鉴于rm除了最简单的情况外,它都用于删除目录,为什么rmdir甚至存在?该功能包含在rm. 这只是历史偶然吗? shell directory 2 个回答 Voted Best Answer Stephen Kitt 2021-12-20T04:50:24+08:002021-12-20T04:50:24+08:00 取消链接目录最初是一项特权操作: 取消链接目录也是非法的(超级用户除外)。 所以rmdir被实现为一个只删除目录的小二进制文件,当时涉及删除目录..和.目录,然后是目录本身。rmdir被设计为setuid root;它执行单独的权限测试,access以确定是否允许真实用户删除目录。像任何 setuid 根二进制文件一样,最好保持简单且重点突出。 rm -r实际上根据需要使用这个单独的二进制文件来删除目录。 rm -r似乎和之间的持久差异rmdir是这种初始差异的结果。 大概是因为很rm早就获得了递归删除的能力,并且应该有一个非常小的职权范围,所以赋予递归删除自身的能力rmdir从来没有被认为是有用的。rmdir user10489 2021-12-20T06:34:52+08:002021-12-20T06:34:52+08:00 递归 rmdir 的替代方案(很方便)是这样的: find . -depth -type d -exec rmdir {} \; 这将仅删除空目录,如果其中一些不为空,则会给出许多无害的错误。 递归 rmdir 可能更聪明,并在遇到错误时中止子树,而不是继续获得级联错误,但可能不会更快。 正如所指出的, rmdir 确实有这个-p选项,它不完全是递归的。并且如上所述使用 find 的能力可能会消除为其添加递归选项的动机,因为优势很小。
取消链接目录最初是一项特权操作:
所以
rmdir
被实现为一个只删除目录的小二进制文件,当时涉及删除目录..
和.
目录,然后是目录本身。rmdir
被设计为setuid root;它执行单独的权限测试,access
以确定是否允许真实用户删除目录。像任何 setuid 根二进制文件一样,最好保持简单且重点突出。rm -r
实际上根据需要使用这个单独的二进制文件来删除目录。rm -r
似乎和之间的持久差异rmdir
是这种初始差异的结果。大概是因为很
rm
早就获得了递归删除的能力,并且应该有一个非常小的职权范围,所以赋予递归删除自身的能力rmdir
从来没有被认为是有用的。rmdir
递归 rmdir 的替代方案(很方便)是这样的:
这将仅删除空目录,如果其中一些不为空,则会给出许多无害的错误。
递归 rmdir 可能更聪明,并在遇到错误时中止子树,而不是继续获得级联错误,但可能不会更快。
正如所指出的, rmdir 确实有这个
-p
选项,它不完全是递归的。并且如上所述使用 find 的能力可能会消除为其添加递归选项的动机,因为优势很小。