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

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

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

find -type d -name someDirs -exec rm -rf {}/* \;

但它不起作用。有什么建议吗?

答案1

您的命令存在一个问题,即在实际调用命令之前,您的 shell 会进行通配符扩展。由于您的 shell 找不到匹配的文件(因为当前目录中{}/*没有带有文字名称的目录),因此将不加更改地传递给命令,然后命令将对其进行修改,以删除目录中名为文字的文件,因为该命令不会再次扩展通配符。您可以通过运行来“调试”此问题{}*find*someDirsrm

find -type d -name someDirs -exec echo rm -rf {}/* \;

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

find -type d -name someDirs -exec sh -c 'rm -rf {}/*' \;

或者像这样测试:

find -type d -name someDirs -exec sh -c 'echo rm -rf {}/*' \;

答案2

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

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

因此,你的命令将是:

find SomeDir1 SomeDir2 -mindepth 1 -exec rm -rf '{}' \+

答案3

  find . -type f -delete

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

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

  find . -type f -exec rm {} \;

编辑:正如 Nate 所说,这不是正确答案。

相关内容