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

我试图删除一些目录的内容(但不是目录本身)使用这个:

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

但它不起作用。 任何提示?

你的命令的问题是在命令被实际调用之前,通配符扩展是由shell完成的。 由于您的shell没有find与{}/*匹配的文件(因为您在当前目录中没有带文字名称的目录),所以*会毫无变化地传递给该命令,然后将被修改find删除someDirs目录中名为literal *文件,因为rm命令不会再扩展通配符。 你可以通过运行来“debugging”这个

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

代替。 为了确保shell有机会扩展你的* ,让exec产生另外一个可以扩展* (并且保护命令不会被单引号扩展)的shell,如下所示:

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

或者像这样testing它:

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

您可以给目录(或多个目录)作为参数来find并使用-mindepth选项告诉它跳过它:

– 最低水平
不要在低于级别的级别上应用任何testing或操作(非负整数)。
-mindepth 1表示处理除命令行参数以外的所有文件。

所以,你的命令是:

 find SomeDir1 SomeDir2 -mindepth 1 -exec rm -rf '{}' \+ 
  find . -type f -delete 

将删除当前目录下的所有文件,而仅保留目录结构。

如果你的find命令不支持-delete(这个稍微现代,但是现在已经有几年了),那么:

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

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