如何从目录中删除所有文件?

use*_*637 376 command-line rm

我得到的最接近的是

# rm /path/to/directory/*.*
Run Code Online (Sandbox Code Playgroud)

但这不适用于没有扩展名的文件......

Rin*_*ind 431

Linux 不使用扩展。由文件的创建者决定名称是否应具有扩展名。Linux 查看前几个字节以确定它正在处理的文件类型。

* 隐藏文件和目录是名称以.(点)字符开头的文件和目录,例如:.hidden-file.hidden-directory/。请注意,在 Bash 中,如果设置了该dotglob 选项(默认情况下是关闭的),它rm也会对隐藏文件起作用,因为当*shell 展开它们以提供文件名参数列表时,它们将被包含在内。

  • 如果您还想删除隐藏文件,请在运行 `rm (...)` 之前运行 `shopt -s dotglob` (16认同)
  • * 表示`所有文件` ;) `*.*` 表示名称中包含`.` 的所有文件 (11认同)
  • @Rinzwind,更准确地说,星号表示“零个或多个任何字符”。所以 `*a*` 表示零个或多个字符,后跟 `a` 后跟零个或多个字符。它将匹配文件名“happy”、“apple”、“a”或“la”。 (11认同)
  • @user784637 你太容易被打动了 (9认同)
  • 如果目录为空,则命令返回错误:`rm:无法删除'empty_dir / *':没有这样的文件或目录` (3认同)
  • 我只会使用 `rm -r /path/to/directory` 除非它会摆脱目录本身。至少这样你也可以摆脱隐藏文件 (2认同)

Lil*_*aru 246

警告:如果您的路径中有空格,请确保始终使用引号。

rm -rf /path/to the/directory/*
Run Code Online (Sandbox Code Playgroud)

相当于 2 个单独的rm -rf调用:

rm -rf /path/to
rm -rf the/directory/*
Run Code Online (Sandbox Code Playgroud)

为避免此问题,您可以使用'单引号'(防止所有扩展,甚至是 shell 变量)或"双引号"(允许扩展 shell 变量,但防止其他扩展):

rm -rf "/path/to the/directory/"*
Run Code Online (Sandbox Code Playgroud)

在哪里:

  • rm- 代表移除
  • -f- 代表force,例如,当您不想被询问/提示是否要删除存档时,这会很有帮助。
  • -r- 代表递归,这意味着您要递归地遍历每个文件夹并删除所有内容。

  • 我发现这是比标记为接受的答案更全面和更有帮助的答案。 (11认同)
  • `rm -rf /path/to/directory/*` 不会删除文件夹中的隐藏文件,例如 `.htaccess`。也许`rm -rf /path/to/directory/.`?没试过 (2认同)

小智 51

要删除目录中的所有文件(包括隐藏文件和子目录),请运行:

rm -rf /path/to/directory/{*,.*}
Run Code Online (Sandbox Code Playgroud)

  • 这个 glob 不匹配“.”吗?还有“..”? (7认同)
  • @hertzsprung - 确实如此,它会警告您无法删除`./` 和`../`,但仍会删除隐藏文件。 (7认同)
  • 这应该是美丽的公认答案。谢谢! (2认同)

小智 16

要删除目录中的所有文件和目录(包括隐藏的),您可以尝试以下操作:

这里我们指定-mindepth 1排除目录 dir_name 本身。
看看下面的链接:https :
//unix.stackexchange.com/questions/12593/how-to-remove-all-the-files-in-a-directory

  • 小心,因为删除和重新创建文件夹可能会导致此文件夹的权限不同/错误! (8认同)

Ric*_*way 11

如果你只想删除 /path/to/directory 中的文件,你可以这样做

find /path/to/directory -type f -print0| xargs -0 rm 
Run Code Online (Sandbox Code Playgroud)

或者

find /path/to/directory -type f -exec rm '{}' \;
Run Code Online (Sandbox Code Playgroud)

您可以使用 加载find,优点是您可以列出找到的内容而无需通过管道将其导入,rm以便您可以在开始之前查看将要删除的内容。

  • 你真的应该在 rm 之后添加一个 -- 。没有这个,如果你有一个文件名 -rf 或类似的将被解释为 rm 的参数。例如 xargs -0 rm -- 或 -exec rm -- {} \; (3认同)
  • `GNU find` 作为 `-delete` 谓词。如果你还想用`-exec`,用`+`代替`\;`会聚集`rm`调用,提高效率。 (2认同)

Tob*_*ler 6

如果您还想删除所有子目录和目录本身,您可以使用rm -rf /path/to/directory. 但是在按回车之前总是仔细检查你的行,rm -rf也会造成很多破坏,例如,如果你在拥有超级用户权限的情况下不小心在第一个斜杠后插入了一个空格......