rmdir(1)和rm(1)共存的原因是什么?


Answers:


27

主要原因可能是历史原因。在过去,没有rmdir(2)mkdir(2)系统调用(我们在这里讨论第七版UNIX™),并且rmdir(1)(必然)是一个SUID根程序,它使用unlink(2)系统调用删除目录。

可以从以下网站在线获得第7版UNIX手册:http://cm.bell-labs.com/7thEdMan(上次检查日期为2017-04-23);它们也可以从http://plan9.bell-labs.com/7thEdMan获得(最新检查于2017-04-23)。对于第2卷中的文章,似乎至少还有一个在线替代资源-http : //wolfram.schneider.org/bsd/7thEdManVol2/-在第1卷中有指向FreeBSD站点的命令和系统调用的链接。 。

rm命令(常规的非SUID程序)调用该rmdir(1)命令以删除空目录。它本身不能这样做。需要root权限。因此,该rmdir(1)命令(在Unix V7中为源代码,请参见此处)用于删除空目录,而该rm命令本身并未删除空目录。

要使用rm删除目录,您必须提供-r选项。

还有一个对称性的论点。您需要一个命令mkdir(1)来创建目录。发出命令rmdir(1)撤消已执行的操作似乎是合理的mkdir(1)。另外,它们(现在)是the rmdir(2)mkdir(2)system调用的简单执行器—是的,在第7版UNIX中,mkdir(1)它也是SUID根程序,使用该mknod(2)调用创建目录节点,并使用该调用在目录link(2)中创建...条目。 。


啊哈!这一切都说得通,太好了!

2
真好 我只是检查了3BSD的副本,这里也没有rmdir syscall的文档,并且rmdir(1)仍使用unlink实现。
安迪·罗斯

4
mknod +链接和取消链接系统的一个主要缺点是创建目录不是原子操作,因此最终可能会得到部分完整的目录。设计了许多程序来检查文件系统是否出现不一致的情况。fsck(1)是幸存的那个。
乔纳森·莱夫勒

@Jonathan,将Xenix的回忆带回了。!是的,确实可能发生坏事。
Fiasco Labs 2012年

6

“ rm”不适用于目录。您必须使用rmdir或指定-r开关以进行递归删除。原因是历史性的:unlink并且rmdir是单独的系统调用,并且起源于Unix的早期。


4
一个令人高兴的副作用是,当您打算仅删除文件时,意外删除目录的可能性会略微降低。

谢谢。我注意到“ rm -r”和“ rmdir”具有相同数量的按键。rmdir是否纯粹是出于历史原因而存在(与几十年的Unix程序兼容)?

2
实际上,早在Unix的早期,既rmdir(2)没有mkdir(2)系统调用,也没有系统调用。用户root可以使用该mknod(2)调用创建目录节点,并使用该调用在目录link(2)中创建...条目;并root可以使用该unlink(2)调用删除目录条目。
乔纳森·勒夫勒

3

rmdir也仅删除目录。如果要确保您不删除目录中的任何其他文件,rmdir则比rm -r(更安全)(除非您为rm 加上别名,以便始终需要确认删除的内容,即alias rm='rm -i'〜/ .bashrc或正在使用的内容) )。


1

另外,rmdir使用浮动(通配符)表达式可以轻松删除空目录。例如,要删除其中的所有空目录/tmp而不接触任何包含内容的文件或目录,请执行以下操作:

cd /tmp ; rmdir *

考虑使用rmdir /tmp/*。如果/tmp目录确实很大,则由于每个名称额外的五个字符,这可能会更快地占用参数空间,但是不需要cd在目录层次结构中移动。还值得考虑rmdir /tmp/* 2>/dev/null避免看到错误消息(通常会出现很多错误消息,并且几乎所有错误消息都与手头的任务无关)。
乔纳森·莱夫勒
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.