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

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

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

我记得chmod 777 .* -Rchmod隐藏文件做了这些事,结果chmod破坏了我的整个文件系统。显然,我使用的是 root 帐户。

答案1

不,如果你没有对 shell 进行大量调整,这不会删除以 开头的文件或目录.。要删除它们,你也可以明确列出它们

rm -rf .file .dir

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

rm -rf .[^.]* ..?*

编辑这里的要点是,您不能使用.*来匹配像 这样的文件.file,因为.*.*?也将匹配....[^.]*匹配像 这样的文件.file,而..?*匹配像..foo(这样的文件*匹配零个或多个字符,而?匹配一个字符)。

答案2

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

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

答案3

因为我认为这个问题更多地是关于 * 的作用(而不是 rm),所以让我们尝试另一种方法。


如果您不确定 * 的作用,您可以先使用无害的命令(如 echo)进行“测试”。在运行此命令之前,请尝试猜测如果在主目录中运行它们,它们将显示什么。

echo *
echo .*

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

mkdir ~/star_test/
cd ~/star_test/
>.file1
>file2

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

cj@zap:~/star_test$ ls -1a
.
..
.file1
file2

现在注意使用 echo 命令时 * 会扩展成什么:

cj@zap:~/star_test$ echo *
file2
cj@zap:~/star_test$ echo .*
. .. .file1

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

cj@zap:~/star_test$ rm -rf *
cj@zap:~/star_test$ ls -1a
.
..
.file1

如您所见,他确实只删除了 file2,因为 * 只扩展为 file2。如果您输入 rm -rf .*,则与写入相同

rm -rf . .. .file1

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

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


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

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

cd ~/star_test/
mkdir -p test1/test2/test3
sudo chown root.root test1
cd test1/test2/test3/
>.file1
>file2

所以现在我们再次遇到这种情况,但是如果 rm 开始失控,则由 root 拥有的 test1 作为保护。

cj@zap:~/star_test/test1/test2/test3$ ls -a
.  ..  file2  .file1
cj@zap:~/star_test/test1/test2/test3$ echo .*
. .. .file1

因此让我们删除所有内容:

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

而且看起来 rm 并没有删除 . 和 .. 即使我们告诉他这么做!!!

因此,经过这个冗长的回答后,使用以下命令可以安全地删除目录中的所有内容:

rm -rf * .*

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

答案4

清空整个文件夹的更简单方法,同时避免了在这个答案,就是简单地删除并重新创建目录本身。为了确保在符号链接目录中此操作正确运行,请使用以下几行:

cd ..
rm -rf $(readlink -f yourdir) #remove the directory, treat the case of a symlink
                        # by using readlink, to recreate the linked-to directory
mkdir $(readlink -f yourdir) # recreate the directory to have it empty
cd yourdir

(如果您使用yourdir而不是,则$(readlink -f yourdir)只会在原始位置保持满的情况下替换链接)

相关内容