如何在不删除bash目录的情况下删除目录中的所有文件和子目录?


53

是否有命令删除目录中的所有文件和子目录而不删除目录?

例如,如果我的目录“ dontDeleteMe”具有子目录“ 1”,“ 2”,“ 3”,并且每个子目录中都有一些图片,那么如何删除子目录“ 1”,“ 2”和“ 3”以及其中的所有文件,而没有删除父目录“ dontDeleteMe”?

Answers:


66

要删除一切一个目录不删除的目录,键入:

rm -rfv dontDeleteMe/*

请注意,该/*部分非常重要。如果在之前放置一个空格*,它将删除当前目录中的所有文件。

此外,非常小心玩耍rm-r并且*都在同一个命令。它们可能是灾难性的组合。

更新: 好的,我意识到,如果您确实有隐藏/点文件[文件名开头带有点,例如.hidden],那么这些文件将保持完整。

所以真的,到了最简单的解决原来的问题是: rm -rfv dontDeleteMe && mkdir dontDeleteMe

另一个可能是使用find-exec选项或管道xargs(如下):

find dontDeleteMe/* -print0 | xargs -0 rm -rv


您可以举一个使用xargs的例子吗?什么是xargs?
justingrif 2011年

@justingrif: find dontDeleteMe/* -print0 | xargs -0 rm -rv 我相信在大多数情况下,无论空格如何,这都行得通。但是cd到/tmp/并创建一个测试目录,然后尝试一下。:)
Matt

哦,并且在联机帮助页中: “ xargs-从标准输入生成并执行命令行”
Matt

5
重新制作目录并不等于删除其内容。例如umask目录权限差异,所有者差异等... enzotib的答案将解决您原始语法的问题

3
这不是一个好答案。使用*是危险的,如果没有“ dotglob”,将无法在点文件上使用(请参见下文)。rm -rf dontDeleteMe && mkdir dontDeleteMe无法确保使用相同的权限/所有者重新创建目录。而是,使用find dontDeleteMe/ -mindepth 1 -delete以下变体之一。
尼尔斯·托德曼

27

rm -r ./*并非始终都能正常工作的唯一原因是因为您可能拥有与不匹配的隐藏文件和/或文件夹*

为此,请bash提供一个使*所有内容(甚至是隐藏对象)匹配的选项:

cd dont-delete-me
shopt -s dotglob
rm -r ./*

dotglob如果继续使用执行上述命令的shell,将其重置为默认(未设置)状态将非常有用:

shopt -u dotglob 

当你有大量的文件,可也不能工作
秒。

23

打开终端(Ctrl+ Alt+ T)ant键入:

find somedir -mindepth 1 -delete

这将匹配其中的所有文件和目录somedir及其(大)子项,包括“隐藏”的点文件,但somedir由于会排除自身-mindepth 1,然后是-delete它们。


欢迎来到AskUbuntu!虽然您的答案可能会对原始海报有所帮助,但由于缺乏信息来说明这将如何帮助他/她,因此您的答案不完整。
Oyibo,2012年

3
缺乏解释,但仍然是最佳答案。在OSX中也可以使用(当然,除了打开Terminal的方式以外)。
noamtm 2015年

6
find /dontDeleteMe/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;

使用xdev选项仅在设备边界内删除文件。


GNU找到了-delete。它暗示着-depth并且比它容易记住-depth -exec rm -Rf {} \;
Nils Toedtmann

4

要删除(在终端中)除名为“ dontdelete”的基本目录以外的所有文件和子目录:

rm -rf dontdelete/*

这不会删除隐藏文件,因此“所有文件”的语句可能太粗体。
Stefan van den Akker,2015年

4

您可以将find其与-delete标志一起使用:

find dontDeleteMe/* -delete

,这/*很重要,因为它告诉find您仅在INSIDE文件夹内搜索“ dontDeleteMe”。

还要确保该-delete标志位于find命令的末尾。


1
除非您启用,否则此解决方案不会删除任何隐藏文件dotglob。否则,使用-mindepth 1标志选项似乎是使其正常工作的唯一方法。
Stefan van den Akker,2015年

3
rm -rf  directory/{.*,/*}

怎么说:

删除所有以开头的文件。在“目录”和所有其他文件中。

尽管Neftas指出,这种解决方案并不安全!

更安全的解决方案是:

 rm -rf directory/!(.|..)

该命令可能会很危险,因为您同时包含...目录。更改{.*}为可以避免这种情况{.??*},但是您不会删除只有一个字符的隐藏文件,例如.a
Stefan van den Akker,2015年

怎么了 rm -rf directory /!(。| ..)
Tebe 2015年

这看起来比我想出的要好得多。我可以建议您编辑答案吗?
Stefan van den Akker,2015年

建议已接受)
Tebe 2015年

1

我不确定为什么这么复杂,如果我做错了,请帮助我

cd DoNotDeleteDir #<- this is just to make sure we are inside
find . | xargs rm -rf

而已


这也有尝试删除当前目录的轻微缺陷,这当然是行不通的,因为它仍被用作调用shell的工作目录。
大卫·佛斯特

1

有一个更简单的答案:

  1. cd dontDeleteMe

  2. rm -rf *

基本的系统管理讲课时间:使用像这样的清扫命令时,请务必注意您所处的位置。

我不能这么说。我不得不找回一个盒子,因为有人没有注意并rm -rf *在/时输入。

* nix假设,如果您是root用户或以root用户身份sudo-ing,您就知道自己在做什么。因此,在执行操作之前,请确保您知道自己在做什么。

确保在发出“ rm”之前您的“ cd”命令可以工作的另一种方法是使用

cd dontDeleteMe && rm -rf *

6
这是一个危险的建议。您想要的是: cd dontDeleteMe && rm -rf *
Izkata 2011年

@Izkata或在发出rm命令之前,请确保检查cd操作是否成功。
伊莱亚·卡根

1
@EliahKagan这正是我的代码段所做的...
Izkata 2011年

实际上,它并没有比您建议的危险高或低。&&所做的全部工作就是将两个命令链接在一起,以便它们同时执行。如果有什么方法,我的方法实际上是SAFER,因为您必须在执行rm -rf *之前停止并查找。暂停仔细检查总是更好。
user30619 2011年

5
@ user30619 &&操作员不只是将命令链接在一起;而是将它们链接在一起。它要求每个命令都必须成功,然后才能执行下一个命令。如果cd命令由于任何原因而失败(目录不存在,特权等),则该rm命令将不会执行。我会说更安全。
ean5533

0
  1. 对我来说最简单的事情-Windows专家,但Ubuntu新手
  2. 单击启动器上的“文件”图标
  3. 导航到要删除的文件和文件夹所在的目录
  4. 右键单击文件旁边窗口的空白区域,然后单击“在终端中打开”-使“文件”窗口保持打开状态
  5. 终端窗口将打开,并将被“设置”到您所在的文件夹
  6. 您可以输入“ dir”(在我说输入时不加引号),然后按Enter键以在终端显示文件和文件夹的列表-只是为了证明您“在”正确的文件夹中
  7. 输入“ rm -rf *”,然后按Enter
  8. 根据要删除的文件夹/文件的大小,系统将暂停
  9. 当终端提示返回时,您打开的“文件”窗口现在将显示“文件夹为空”
  10. 我使用这种方法很成功,它使我很高兴在“文件”窗口中以及在终端窗口中通过Dir命令看到文件/文件夹
  11. 我对文件窗口显示的文件夹现在为空感到很欣慰-特别是因为我一直在寻找这些文件所在的垃圾箱,
  12. 感谢其他所有提交答案的人-非常有用

这似乎很令人费解-尤其是因为您rm -rf *无论如何都要运行。
David Foerster,2016年

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.