按特定名称递归查找目录,然后清除它们

时间:2017-06-30 03:54:44

标签: linux bash find

假设给出了以下项目结构:

/
|
|- /bin
|- /src
     |
     |- /bin
     |- abc
         ...
         |
         |- /bin

我想删除bin子目录的内容,但不删除它们。如何通过Bash命令行实现tis?

修改

我尝试了find . -regex bin/* -type d -exec rm -rf {} \;,但无济于事。

3 个答案:

答案 0 :(得分:1)

我建议使用GNU find:

find . -regex ".*/bin/.*" -type f -exec echo rm {} \;

如果一切正常,请删除echo

答案 1 :(得分:1)

如果要删除文件,将-r传递给rm是不必要的(确实很危险)。

此外,find"知道"如何删除,而无需首先调用rm

find . -type f -wholename "*/bin/*" -delete

答案 2 :(得分:0)

调试命令:单独尝试find的每个参数,看它是否产生预期的输出。

我们很快就看到了

find . -regex bin/*
由于正则表达式存在问题,

无法正常工作。如果我们检查man是否有查找,我们会看到正则表达式必须与完整路径匹配:

  

-regex模式        文件名与正则表达式模式匹配。这是一场比赛        在整个路径上,而不是搜索。例如,匹配文件        名为./fubar3', you can use the regular expression。* bar。'        或.*b.*3', but not f。* r3'。

这应该做的工作:

find . -regex '".*/bin/.*"' -type d -delete

或使用您的命令:

find . -regex '".*/bin/.*"' -type d -prune -exec rm -rf {} \;

请记住引用您的表达式以避免意外的shell扩展。