我每天都使用 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 开关进行递归删除。原因是历史原因:unlink
和rmdir
是独立的系统调用,并且从 Unix 早期开始就存在。
答案3
rmdir 也只会删除空的目录。如果你想确保不删除目录中的任何其他文件,则rmdir
比这更安全rm -r
(除非你为 rm 设置了别名,这样你总是需要确认你删除的内容,即alias rm='rm -i'
在 ~/.bashrc 或你正在使用的任何文件中)。
答案4
此外,rmdir
使用通配符表达式可以轻松删除空目录。例如,要删除所有空目录而不/tmp
触及任何包含内容的文件或目录:
cd /tmp ; rmdir *