rm -rf 是什么意思?

当使用rm -rf来删除文件或目录时,它会做什么? -r-f选项如何一起工作?

6为什么之前从来没有人问过这个问题? - Dan Dascalescu
17@DanDascalescu 因为通过阅读 man 手册就可以轻松找到答案,这应该是任何人回答这样的问题时首先要查找的资源。 - David Richerby
11试一试就知道了。(剧透:不要试。) - geometrian
点赞,因为经验法则并不推荐使用,而且尝试在根目录下执行此操作会有一些特殊行为。 - Andrew Grimm
@noonand: 你可能更想说的是“压制法语...以及从那之后一切走下坡路的事情”!;-D Warf!Warf!你因为幽默得到了我的点赞。 - Cbhihe
3哎呀!这个问题肯定是DevRobot搞的恶作剧!你怎么可能在没有查阅man手册的情况下达到你的Karma等级。现在...你确定你是人类吗?! - Cbhihe
2确实完全读起来像是个玩笑。就好像有人试图问:“雨是由H2O制成的吗?”(一个好的答案是:通常是,但未来一旦人类摧毁了地球上一半的植被,其中50%将变成酸性(如酸雨))。 - syntaxerror
5个回答

命令rm -rfrm -r -f相同。
rm的man页面(在终端中键入man rm查看)-r的作用是:
remove directories and their contents recursively

-f 的作用是:
ignore nonexistent files and arguments, never prompt

所以结合起来,它们两者都会发生作用。
事实上,这是一个非常危险的命令,因为它会递归地删除您选择的目录中的所有内容(或只删除您选择的文件),而且它在执行时不会提示您。
请谨慎使用此命令!

@Paul,斜杠有什么作用?我经常使用这个命令删除目录,而且不加斜杠。 - Octopus
2@章鱼,斜杠本身表示根目录。 rm -rf / 理论上将删除您具有写权限的任何目录中计算机上的所有文件。如果您是root用户,那意味着清空整个系统。(实际上,这不会起作用,因为GNU rm 命令有一个特殊情况,除非您同时使用 --no-preserve-root 参数,否则它会拒绝允许执行 rm -r / )。 - cjm
13尽管如此,我不建议尝试rm -rf /来测试它是否被正确捕获。 - cjm
@cjm 这就是虚拟机和快照的用途。 - Matt
2@mattburnett 在虚拟机中也是危险的:你可能会有一些在虚拟机中不属于本地的挂载点。特别是,我相信将主机机器上的一个目录挂载到虚拟机上以在主机和虚拟机之间共享文件是相当常见的。 - hvd
@hvd 这是真的,但是断开虚拟机的网络适配器和可移动媒体是非常简单的。而且,任何拥有虚拟机的人可能都会有一个用于运行未知可执行文件的“隔离”虚拟机。 - Matt
@cjm:Solaris rm也是这样的。最近,OpenBSD rm也是如此。(显然这甚至是POSIX的要求?) - user1686
1@mattburnett 我有虚拟机。我没有被隔离的虚拟机。我只是不运行未知的可执行文件。 :) - hvd
@章鱼 抱歉,但不能说。看起来我的评论被删除了... - Paul Uszak
查找-删除也是危险的。 - 0x6773

除了之前的正确答案外,我还想教你如何钓鱼:
当你对一个命令的工作原理、选项和功能不确定时,打开终端并输入:
man <command>

例如:

man rm

一旦进入其中,您可以搜索选项。手册可能非常长,所以在终端中键入:
/<pattern>

所以举个例子,做这样的事情:
/-f

你可以轻松到达以下地点:
-f, --force
              ignore nonexistent files and arguments, never prompt

输入/-r后,你将得到:
-r, -R, --recursive
              remove directories and their contents recursively

您可以使用n(下一个)和N(上一个)在搜索结果之间移动。

奖励:

如果您需要做某事,但不知道命令名称,请使用apropos在手册页面中进行搜索:

apropos <pattern>

例如:

apropos directory listing

"rm"是"remove"的缩写。 "r"标志用于递归地删除目录及其内容,而"f"表示强制删除,它会忽略任何确认提示。

3严格来说,“r标志用于删除目录”并不准确。它会连同其内容一起删除目录,这是一个递归操作。根据你的说法,它只会删除目录,那么子目录和其中的文件呢?因为目录条目仅包含名称-索引映射,仅有这些是没有任何意义的。 - heemayl
你说得对,我会修改我的回答。 - Chris
1-r 递归地删除目录及其内容。 - Jim Balter

如前所述,rm -rf <ARG> 是用来强制递归删除文件的,其中 <ARG> 是一个目录(虽然也可以是一个文件)。 -r(递归删除)的整个意义在于,如果目录不为空,rm 无法删除目录,这是因为 rm 使用的底层系统调用(unlink)只能操作空目录。因此,-r 标志的作用是先深度优先搜索进入目录并先删除文件,然后只有当目录为空时才会删除它。通过使用带有 -delete 标志的 find 命令也可以实现相同的效果(当您不指定按 -type 进行过滤时,但这是另外一回事)。
关于-f选项,它有两个作用-一是防止提示是否要删除文件(比如当你在自己的目录中删除其他用户拥有的文件时,它不会显示rm: remove write-protected regular empty file 'f1'? 确认提示),二是忽略不存在的文件。所以例如,对于一个不存在的文件名,你应该会得到rm: cannot remove 'nonexistent': No such file or directory错误。
另请参阅:

请注意,在这样的目录中
.
├── AAA
│   └── file2.txt
└── BBB
    └── AAA
        └── file1.txt

运行rm -rf AAA将产生以下结果
.
└── BBB
    └── AAA
        └── file1.txt

如果你不确定101%,最好用rm检查虚拟文件夹。