为什么是rm -rf而不是rmdir -rf


13

我一直很好奇为什么删除目录中所有内容的命令是rm -rf

为什么没有标志可以做同样的事情rmdir

使用rmdir目录操作会更直观吗?


9
rmdir删除目录,rm删除。为什么rmdir删除非目录很直观?
斯特凡Chazelas

5
因为不是。你问这个问题晚了40多年,而你问的是错误的人。
user207421

Answers:


25

在早期的Unix File System(至少在1970年左右的V7年代)中,目录是作为特殊文件实现的,只有root可以使用mknod(2)创建它们的系统调用,而只有root可以unlink(2)使用目录特殊文件。

采取这些保护措施是为了保持文件系统结构的一致性。例如,如果允许用户写入目录特殊文件,则他可以使其父目录..指向自身(特别是其自身的i节点)。这将在文件系统中创建循环引用,这将是一件坏事。当然,还有其他可能导致的不一致之处,这只是一个明显的例子。

一致性是通过如用户空间程序维护mkdir(1)rmdir(1)其设定-UID根,这样他们可以使代表的非特权用户的特权系统调用。将递归添加到时rm(1),remove命令将作为当前UID运行,然后rmdir(1)仅调用来删除空目录。这仍然是提升权限的非常标准的方法:不要使用超出您需要的权限。

一段时间后mkdir(2),并rmdir(2)添加他们自己的系统调用,但之间的关系rm(1)rmdir(1)遗迹。

就个人而言,我觉得这更令人满意,rmdir junk并且知道我做的最糟糕的事情是删除一个空目录。


1
关于最后一句话:大概,如果递归删除操作在中rmdir,它仍然需要一个-r标志。(rmdir -r junk而不是rm -r junk,并且rmdir junk仅在目录为空时仍然有效)
user253751


2

纯粹出于意见考虑,但是rmrmdir删除目录的同时删除文件。目录是文件,但是是一种特殊的文件,因此rm删除它们是有意义的,但是要对其进行特殊处理(即,需要一个额外的选项来启用该功能。)另一方面,并​​非所有文件都是目录,恕我直言,rmdir删除不是目录的内容毫无意义。


1
如果是这种情况,那为什么不能rm删除一个空目录(递归模式除外)?
user253751

同样的原因,它不能删除完整目录-它需要-r标志来启用目录特殊文件功能。
达尔文·冯·科拉克斯

1
那里的循环推理...
user253751

我想说我的推理
有点
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.