![rm -rf * 会删除当前目录中的所有文件/文件夹吗?](https://linux22.com/image/1235374/rm%20-rf%20*%20%E4%BC%9A%E5%88%A0%E9%99%A4%E5%BD%93%E5%89%8D%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6%2F%E6%96%87%E4%BB%B6%E5%A4%B9%E5%90%97%EF%BC%9F.png)
会rm -rf *
删除当前目录中的所有文件/文件夹吗?我想确保通配符*
不会在上层目录中向上移动并清除我的所有文件系统。:D
我记得chmod 777 .* -R
对chmod
隐藏文件做了这些事,结果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)
只会在原始位置保持满的情况下替换链接)