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

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

我每天都使用 BSD 和 Linux,从来没有遇到过必须使用 rmdir(1) 而不是 rm(1) 的情况。rmdir 存在的目的是什么?

答案1

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

第 7 版 UNIX 手册可在线获取:http://cm.bell-labs.com/7thEdMan(最后检查时间:2017-04-23);也可以在http://plan9.bell-labs.com/7thEdMan(最后检查时间:2017-04-23)。网上似乎至少还有一个替代来源——http://wolfram.schneider.org/bsd/7thEdManVol2/— 参见第 2 卷中的文章,并附有FreeBSD第 1 卷中的命令和系统调用。

rm命令(常规非 SUID 程序)调用rmdir(1)命令来删除空目录。它自己无法执行此操作;这需要 root 权限。因此,该rmdir(1)命令(请参阅这里存在一个用于删除空目录的实用程序(因为它在 Unix V7 中的源代码),但该rm命令本身并没有删除空目录。

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

还有一个对称性论点。您需要一个命令mkdir(1)来创建目录;似乎有一个命令rmdir(1)来撤消所做mkdir(1)的操作是合理的。此外,它们(现在)是rmdir(2)mkdir(2)系统调用的简单执行者——是的,在第 7 版 UNIX 中,mkdir(1)还有一个 SUID 根程序,使用mknod(2)调用来创建目录节点,使用link(2)调用来创建目录中的...条目。

答案2

“rm” 不适用于目录。您必须使用 rmdir 或指定 -r 开关进行递归删除。原因是历史原因:unlinkrmdir是独立的系统调用,并且从 Unix 早期开始就存在。

答案3

rmdir 也只会删除空的目录。如果你想确保不删除目录中的任何其他文件,则rmdir比这更安全rm -r(除非你为 rm 设置了别名,这样你总是需要确认你删除的内容,即alias rm='rm -i'在 ~/.bashrc 或你正在使用的任何文件中)。

答案4

此外,rmdir使用通配符表达式可以轻松删除空目录。例如,要删除所有空目录而不/tmp触及任何包含内容的文件或目录:

cd /tmp ; rmdir *

相关内容