rm -rf * 会删除当前目录中的所有文件/文件夹吗?

Oli*_*nde 22 shell globbing

rm -rf *删除当前目录中的所有文件/文件夹吗?我想确保通配符*不会在上层目录中向上移动并擦除我的所有文件系统。:D

我记得chmod 777 .* -Rchmod隐藏文件做的,它chmod编辑了我所有的文件系统。显然,我使用的是 root 帐户。

Ben*_*ier 16

不,如果您没有对 shell 进行大量调整,这将不会删除以.. 要删除它们,您也可以明确列出它们

rm -rf .file .dir
Run Code Online (Sandbox Code Playgroud)

或使用正确的 glob 模式(感谢 Chris)

rm -rf .[^.]* ..?*
Run Code Online (Sandbox Code Playgroud)

编辑这里的重点是你不能.*用来匹配文件.file,因为.*or.*?也将匹配..or ..[^.]*匹配类似 的文件.file,而..?*匹配类似..foo(*匹配零个或多个字符,而?恰好匹配一个) 之类的文件。


mpe*_*ez0 13

如果要删除目录及其所有内容,则可以按名称chdir进入父目录和rm -rf该目录,绕过整个 globbing 问题。如果要删除内容但保留目录,最简单的方法是删除所有内容然后重新创建目录。

想出一个匹配所有可能的目录条目 save 的 glob 是很复杂的。和 ..; 很容易想出一个* .??*在实践中几乎总是有效的简单答案(例如,)。这对于交互式使用来说是可以的,因为它很容易记住,并且它不起作用的时间可以用 post-rm 来捕捉ls -a。对于脚本,执行全部删除并重新创建空目录更容易。


Joh*_*han 10

因为我认为这个问题更多是关于 * 做什么(而不是 rm),让我们尝试另一种方法。


如果您不确定 * 的作用,您可以先使用像 echo 这样的无害命令“测试”。在你运行这个之前,试着猜测如果你在你的主目录中运行它们会显示什么。

echo *
echo .*
Run Code Online (Sandbox Code Playgroud)

但首先让我们创建一个游乐场,这样我们就可以和星星一起玩,看看我们最终会得到什么。

mkdir ~/star_test/
cd ~/star_test/
>.file1
>file2
Run Code Online (Sandbox Code Playgroud)

现在在这个目录中我们有这个:

cj@zap:~/star_test$ ls -1a
.
..
.file1
file2
Run Code Online (Sandbox Code Playgroud)

现在注意 * 扩展为使用 echo 命令的内容:

cj@zap:~/star_test$ echo *
file2
cj@zap:~/star_test$ echo .*
. .. .file1
Run Code Online (Sandbox Code Playgroud)

那么让我们看看 rm 命令会发生什么

cj@zap:~/star_test$ rm -rf *
cj@zap:~/star_test$ ls -1a
.
..
.file1
Run Code Online (Sandbox Code Playgroud)

如您所见,他只删除了 file2,因为 * 仅扩展到 file2。如果你输入 rm -rf .* 这将与写作相同

rm -rf . .. .file1
Run Code Online (Sandbox Code Playgroud)

老实说,这看起来并不有趣;)

希望这可以澄清您问题的 * 部分。


更新: 然而,正如 Ankur Goel 指出的那样,rm 内置了某种保护(对于 shell 命令来说有点不寻常:)

让我们创建一个新的游乐场:

cd ~/star_test/
mkdir -p test1/test2/test3
sudo chown root.root test1
cd test1/test2/test3/
>.file1
>file2
Run Code Online (Sandbox Code Playgroud)

所以现在我们又有了这个,但是如果 rm 开始变得狂暴,root 拥有的 test1 作为保护。

cj@zap:~/star_test/test1/test2/test3$ ls -a
.  ..  file2  .file1
cj@zap:~/star_test/test1/test2/test3$ echo .*
. .. .file1
Run Code Online (Sandbox Code Playgroud)

所以让我们删除所有内容:

cj@zap:~/star_test/test1/test2/test3$ rm -rf .*
rm: cannot remove directory `.'
rm: cannot remove directory `..'
cj@zap:~/star_test/test1/test2/test3$ ls -a
.  ..  file2
Run Code Online (Sandbox Code Playgroud)

而且看起来 rm 没有删除 . 而且..即使我们告诉他!!!

因此,经过这么长的回答,事实证明使用以下命令删除目录中的所有内容是安全的:

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

但是我会小心使用它,因为我不确定 rm 的所有实现都是这样的!


Ank*_*oel 8

是的。rm -rf 只会删除当前目录下的文件和文件夹,不会向上提升文件树。rm 也不会跟随符号链接并删除它们指向的文件,因此您不会意外修剪文件系统的其他部分。