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