为什么 rm 需要 -r 来表示空文件夹?

为什么 rm 需要 -r 来表示空文件夹?

有件事一直困扰着我:

touch a
rm a

好的,它按预期工作

mkdir a
rm a

需要 -r 才能工作;但我不明白这是什么递归?如果文件夹为空,则不存在任何递归操作。我希望 rm a 尝试删除 a,如果它不为空则失败,并且 rm -r 递归 a 的内容。

为什么会这样?

编辑:这个问题已被标记为完全不相关问题的重复。我的问题可以概括为:为什么我需要一个递归标志来执行非递归操作: mkdir a, rm -ra 没有任何递归性。这与另一个问题无关,即为什么 rm 默认情况下不递归。

答案1

这是因为rm根本就没有删除目录的意思。

最初rm不支持-r,用户只有 1 个选择:删除目录中的所有文件,rm然后删除(现在为空)目录rmdir

显然这样工作是非常烦人,所以-r实施来解决这个问题。

但如果rm /some/empty/dir开始工作,它将不再向后兼容(因此它可能会破坏假设rm /some/empty/dir失败的旧代码)。这-r不是问题,因为尚未定义此行为(因为该-r选项尚不存在)

答案2

man rm

默认情况下,rm 不删除目录。使用 --recursive(-r 或 -R)选项也可以删除每个列出的目录及其所有内容。

我在这里猜测一下:这是一项安全功能,您不会在没有意识到的情况下删除其中包含文件的目录。我假设rm不会首先检查目录是否有内容(与 相比rmdir)。


编辑:我假设在不递归删除文件的情况下,查找文件时会出现问题,因为名称和索引节点存储在目录中。删除该目录将创建带有索引节点但没有文件名的“僵尸”文件。与此帖子相比外部结构

相关内容