rm -rf * 是否从当前目录或父/根目录递归删除文件?

Win*_*ows 8 recursive rm

我想从特定文件夹中递归删除文件和文件夹,所以我从该文件夹中运行了这个命令

rm -rf *
Run Code Online (Sandbox Code Playgroud)

我认为它会递归删除当前目录下的所有文件/目录。之后发生了一些不好的事情(我的服务器宕机了,甚至没有得到 ping 响应)。

Mat*_*nco 12

不要忘记在rm命令之后服务器无法访问的可能性与此无关。这可能是巧合!

最有可能的是,当前工作目录不是您在发出命令时所想的那样。

这样做时你是root吗?

这是发出命令时发生的情况rm -rf *

  1. shell 将通配符模式(*在这种情况下)解析为与所使用的通配符模式匹配的所有文件(包括目录、符号链接和设备特殊文件),在这种情况下,所有不以 a 开头的内容.通常按“字母顺序”排序贝壳。
  2. 然后shell派生一个新的进程和exec()S的第一个版本rm发现你的$PATH,与-rf作为第一个参数,以及匹配的文件,逐一连续参数。

如果rm调用的是标准rm命令,它首先一个一个解析参数,将所有以 a 开头的参数(包括由 shell globbing 产生的参数)-视为选项,直到遇到不以 a 开头的参数-(除了使用 GNU 的命令getopt()在非选项之后接受选项),或者完全是--. 之后的所有内容都被视为文件名。

换句话说,如果您--no-preserve-root在当前目录中有一个名为(例如)的文件,它会被解释为 的选项rm,而不是要删除的文件名!

小心通配符(和文件命名)。如果您-r在当前目录中调用了一个文件,该命令ls *将按相反顺序列出其他文件,而不显示“-r”文件。

换句话说,如果您有一个名为 的文件--no-preserve-root,它将作为选项传递给rm,而不是作为文件名。

使用rm -rf -- *,以防止这种情况发生,同时也删除这些文件开头-。或者简单地使用绝对或相对路径名使文件名以 以外的其他内容开头-,如:rm ./--flagfilerm /abs/path/to/--flagfile

还有一个-i标志可以rm在删除任何内容之前提示(“交互式”)。

  • @derobert,不。`--` 是 POSIX,而不是 GNU。 (3认同)
  • 请注意,`--` 是一个 GNU 特性,它可能不会出现在所有的 `rm` 版本中。删除名为 `-r` 的文件的另一种方法是使用 `rm ./-r`。我建议在你的回答中提到这一点。 (2认同)