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


20

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

我记得chmod 777 .* -Rchmod隐藏文件进行过操作,它chmod消耗了我所有的文件系统。显然,我是root用户。


1
这就是为什么我会这样做rm -rf ./*并明确指定当前目录的原因……但是Ankur似乎说这没关系。
mpen

@Mark:..和./ ..有什么区别?您可以尝试cd ./ ..并查看最终结果:)
Johan 2010年

@Johan:没什么不同...我想这在我疯狂的头脑中更有意义:D
mpen

@Mark:容易犯的错误:)
Johan

Answers:


15

不,如果您不对外壳进行大量调整,则不会删除以开头的文件或目录.。要删除它们,也可以显式列出它们

rm -rf .file .dir

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

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

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


1
您还需要..?*捕获以“ ..”开头的条目(例如..foo)。
克里斯·约翰森

@克里斯:好的,我开始了这种挑剔的疯狂,你是对的;)
本杰明·班尼尔

不仅要使用“正确”的glob模式,还与匹配项的数量有关。在包含大量文件的目录中,Shell很可能不能一次提供5万个文件rm。因此,用*删除目录的内容并不是最明智的方法,恕我直言。
akira 2010年

我认为解释xargs有点超出这个问题的范围。例如,当shell抱怨参数列表过长时,可能会开始考虑这一点。
本杰明·班尼尔

1
我认为这不超出范围,因为我认为OP不确定如何实现他的最终问题/解决方案:删除目录中的所有内容。OP只是已经在考虑一个解决方案(一个糟糕的解决方案),并问这个解决方案为什么会引起问题,这只是在做一般的“错误”事情。更好的方法是:“如何删除目录中的所有文件而不删除目录本身?” OP的解决方案将由于问题的性质而导致问题。
akira 2010年

12

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

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


1
我也建议这样做:丢弃目录并完成
akira

即使您不是答案,这也是一个好主意。
约翰

10

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


如果不确定*的功能,可以先使用无害命令(例如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的所有实现都像这样!


7

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


1

如果你不想动上一级像mpez0说和rm -rf这个特定的文件夹,有一种方法来工作的所有不同的目录/文件.,并..在做当前文件夹:

rm -rf $(ls -A)

当然,如果任何目录/文件在shell IFS特殊变量中包含一个字符(例如空格,制表符,换行符),则可能需要先更改IFS,运行命令,然后还原IFS。


0

清空整个文件夹(又避免此答案中讨论的“参数过多”)的一种简单得多的方法是简单地删除并重新创建目录本身。为了确保在符号链接目录中时此方法正常运行,请使用以下几行:

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)仅在原始位置仍然满的情况下替换链接)


1
这可能会破坏依赖于文件夹inode的内容,并丢弃权限,atime / mtime / ctime / btime,扩展属性和访问控制列表。
丹尼尔·贝克

@DanielBeck谢谢,好点。尽管我想知道,除了硬链接(在目录上,无论如何都强烈建议)之外,什么才有效地依赖于索引节点?但是权限等很重要。因此,在最一般的情况下,应该使用xargs...
Tobias Kienzler 2012年

OS X包含一种机制,可以处理正在移动的文件和文件夹,并且仍然保留关联。在打开最近文档菜单中最明显。AFAICT,它使用inode在内部完成此操作。更多信息。如果其他系统在GUI程序的API中实现类似的功能,我不会感到惊讶。
丹尼尔·贝克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.