我一直很好奇为什么删除目录中所有内容的命令是rm -rf
。
为什么没有标志可以做同样的事情rmdir
?
使用rmdir
目录操作会更直观吗?
我一直很好奇为什么删除目录中所有内容的命令是rm -rf
。
为什么没有标志可以做同样的事情rmdir
?
使用rmdir
目录操作会更直观吗?
Answers:
在早期的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
并且知道我做的最糟糕的事情是删除一个空目录。
rmdir
,它仍然需要一个-r
标志。(rmdir -r junk
而不是rm -r junk
,并且rmdir junk
仅在目录为空时仍然有效)
这是历史。 rm
旨在删除对文件的引用,rmdir
旨在删除与平行的目录mkdir
。许多年前,Unix rm
只能通过调用来删除目录rmdir
。也没有rmdir(2)
系统调用,rmdir
是一个名为的程序unlink(2)
。
参考文献:
纯粹出于意见考虑,但是rm
在rmdir
删除目录的同时删除文件。目录是文件,但是是一种特殊的文件,因此rm
删除它们是有意义的,但是要对其进行特殊处理(即,需要一个额外的选项来启用该功能。)另一方面,并非所有文件都是目录,恕我直言,rmdir
删除不是目录的内容毫无意义。
rm
删除一个空目录(递归模式除外)?
-r
标志来启用目录特殊文件功能。
rmdir
删除目录,rm
删除。为什么rmdir
删除非目录很直观?