我一直很好奇为什么删除目录中所有内容的命令是rm -rf
.
为什么没有标志可以做同样的事情rmdir
?
rmdir
用于目录操作不是更直观吗?
答案1
在早期的 Unix 文件系统中(至少在 1970 年左右的 V7 时代),目录被实现为特殊文件,只有 root 可以使用mknod(2)
创建它们的系统调用,并且只有 root 可以unlink(2)
创建目录特殊文件。
采取这些保护措施是为了保持文件系统结构的一致性。例如,如果允许用户写入目录特殊文件,他可以使其父目录..
指向自身(特别是其自己的 i 节点)。这将在文件系统中创建循环引用,这将是一件坏事。当然,还可能出现其他不一致的情况,这只是一个明显的例子。
一致性由用户空间程序(例如Set-UID rootmkdir(1)
和 )来维护rmdir(1)
,以便它们可以代表非特权用户进行特权系统调用。当递归添加到 时rm(1)
,remove 命令将以当前 UID 运行,然后rmdir(1)
仅调用 来删除空目录。这仍然是一种相当标准的权限提升方法:不要使用超出您需要的权限。
一段时间后,mkdir(2)
和被添加为它们自己的系统调用,但和rmdir(2)
之间的关系仍然存在。rm(1)
rmdir(1)
就我个人而言,我发现更令人满意的是,rmdir junk
并且知道我所做的最糟糕的事情就是删除一个空目录。
答案2
这是历史性的。 rm
是为了删除对文件的引用,rmdir
是为了删除目录,与mkdir
.许多年前,Unixrm
只能通过调用rmdir
.也没有rmdir(2)
系统调用,rmdir
而是一个调用unlink(2)
.
参考:
答案3
纯粹是意见问题,但在删除目录rm
的同时删除文件rmdir
。目录是一个文件,但是一种特殊类型的文件,因此rm
删除它们是有意义的,但要特殊对待它们(即需要额外的选项来启用该功能。)另一方面,并非所有文件都是目录,恕我直言,rmdir
删除不是目录的东西是没有意义的。