如何删除目录中的所有文件和子目录而不删除bash中的目录?

use*_*637 69 command-line bash rm directory

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

例如,如果我有目录dontDeleteMe与子目录123和每个子目录中有几张图片,我怎么能删除子目录12以及3所有的文件在其中,而不删除父目录dontDeleteMe

Mat*_*att 81

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

rm -rfv dontDeleteMe/*
Run Code Online (Sandbox Code Playgroud)

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

另外,要非常小心地使用rm,-r并且*都在同一个命令中。它们可能是一个灾难性的组合。

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

因此,对于原始问题,最简单的解决方案是:

rm -rfv dontDeleteMe && mkdir dontDeleteMe
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用find's-exec选项或管道xargs(如下):

find dontDeleteMe/* -print0  | xargs -0  rm -rv
Run Code Online (Sandbox Code Playgroud)

  • 重新制作目录不等于删除其内容。例如 umask 目录权限差异、所有者差异等... [enzotib 的回答](http://askubuntu.com/a/72469/234837) 将解决您原始语法的问题 (5认同)
  • 这不是一个好的答案。使用 * 是危险的,并且不能在没有“dotglob”的点文件上工作(见下文)。`rm -rf dontDeleteMe && mkdir dontDeleteMe` 不能确保使用相同的权限/所有者重新创建目录。相反,请使用下面的“find dontDeleteMe/ -mindepth 1 -delete”变体之一。 (4认同)

小智 35

开端子(Ctrl+ Alt+ T)蚂蚁类型这样的:

find somedir -mindepth 1 -delete
Run Code Online (Sandbox Code Playgroud)

这将匹配其中的所有文件和目录somedir及其(大)子文件,包括“隐藏的”点文件,但somedir由于-mindepth 1, 将-delete其排除在外。

  • @EricP `find` 与 `-mindepth 1` 和 `rm` 之间的主要区别在于,前者将保留目录并仅删除其内容。它本身并不安全,如果您有权限的话,两者都会删除目录中的所有内容而无需确认。但“find”更灵活(它比“rm”有更多选项)。 (2认同)

enz*_*tib 29

rm -r ./*不总是有效的唯一原因是因为您可以拥有不匹配的隐藏文件和/或文件夹*

为此,bash提供一个选项来*匹配所有内容,甚至隐藏对象:

cd dont-delete-me
shopt -s dotglob
rm -r ./*
Run Code Online (Sandbox Code Playgroud)

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

shopt -u dotglob 
Run Code Online (Sandbox Code Playgroud)


Ser*_*gey 6

find /dontDeleteMe/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;
Run Code Online (Sandbox Code Playgroud)

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

  • GNU find 有“-delete”。它意味着“-深度”,并且比“-深度 -exec rm -Rf {} \;”更容易记住 (2认同)