如何使用 find -exec 和 rm 删除目录内容(而不是目录本身)?

use*_*840 8 linux

我正在尝试使用以下方法删除某些目录的内容(但不是目录本身):

find -type d -name someDirs -exec rm -rf {}/* \;
Run Code Online (Sandbox Code Playgroud)

但它不起作用。有小费吗?

小智 9

您可以将目录(或目录)作为参数提供给find并告诉它使用选项跳过-mindepth

-mindepth 级别
不要在低于级别(非负整数)的级别应用任何测试或操作。
-mindepth 1 表示处理除命令行参数之外的所有文件。

所以,你的命令是:

find SomeDir1 SomeDir2 -mindepth 1 -exec rm -rf '{}' \+
Run Code Online (Sandbox Code Playgroud)


Cra*_*ell 7

  find . -type f -delete
Run Code Online (Sandbox Code Playgroud)

将删除当前目录中及以下的所有文件,保留目录结构。

如果您的 find 命令不支持 -delete (它有点现代,但已经存在几年了),那么:

  find . -type f -exec rm {} \;
Run Code Online (Sandbox Code Playgroud)

编辑:正如 Nate 所指出的,这不是正确的答案。


mih*_*ihi 5

您的命令的问题在于通配符扩展是在实际调用命令之前由您的 shell 完成的。由于您的 shell 没有找到匹配的文件{}/*(因为您{}在当前目录中没有具有文字名称的目录),因此将*其传递给命令不变,然后将修改该命令find以删除*您的文件中名为文字的文件someDirs目录,因为该rm命令不会(再次)扩展通配符。您可以通过运行“调试”它

find -type d -name someDirs -exec echo rm -rf {}/* \;
Run Code Online (Sandbox Code Playgroud)

反而。为了确保 shell 有机会扩展您的*,让我们exec生成另一个可以扩展的 shell *(并保护命令不被首先用单引号扩展),如下所示:

find -type d -name someDirs -exec sh -c 'rm -rf {}/*' \;
Run Code Online (Sandbox Code Playgroud)

或像这样测试:

find -type d -name someDirs -exec sh -c 'echo rm -rf {}/*' \;
Run Code Online (Sandbox Code Playgroud)