![如何使用 find -exec 和 rm 删除目录内容(而不是目录本身)?](https://linux22.com/image/648878/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20find%20-exec%20%E5%92%8C%20rm%20%E5%88%A0%E9%99%A4%E7%9B%AE%E5%BD%95%E5%86%85%E5%AE%B9%EF%BC%88%E8%80%8C%E4%B8%8D%E6%98%AF%E7%9B%AE%E5%BD%95%E6%9C%AC%E8%BA%AB%EF%BC%89%EF%BC%9F.png)
我正在尝试使用以下命令删除某些目录的内容(但不删除目录本身):
find -type d -name someDirs -exec rm -rf {}/* \;
但它不起作用。有什么建议吗?
答案1
您的命令存在一个问题,即在实际调用命令之前,您的 shell 会进行通配符扩展。由于您的 shell 找不到匹配的文件(因为当前目录中{}/*
没有带有文字名称的目录),因此将不加更改地传递给命令,然后命令将对其进行修改,以删除目录中名为文字的文件,因为该命令不会再次扩展通配符。您可以通过运行来“调试”此问题{}
*
find
*
someDirs
rm
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 所说,这不是正确答案。