如何使用find命令查找并删除cromwell-executions目录下任意深度的inputs文件夹
实现方案
核心逻辑说明
find 命令默认支持无深度限制的全路径递归检索,你之前无法达成需求的核心原因,是没有把「inputs 文件夹必须嵌套在 cromwell-executions 目录内部」这个业务约束转化为可被 find 识别的路径匹配规则,而非 find 本身不支持任意深度检索。
整套方案完全匹配你的场景:多个互不嵌套的 cromwell-executions 分散在目录树的不同位置、每个 cromwell-executions 下的 inputs 文件夹分布深度无固定规律。
第一步:预检检索结果(必须执行,避免误删)
删除操作前先执行检索,逐一核对输出的路径是否全部是你需要清理的目标,这里提供两种等效的预检命令,按需选择:
单命令路径过滤版
find . -type d -name "inputs" -path "*/cromwell-executions/*" -print
参数解释
.:从当前执行命令的目录开始向下检索,自动覆盖所有分散在不同位置的 cromwell-executions 目录,不受目录相对深度影响-type d:限定检索对象为目录,避免匹配到同名的普通文件-name "inputs":匹配所有名称为 inputs 的目录-path "*/cromwell-executions/*":硬过滤条件,只要 inputs 目录的完整路径中存在 cromwell-executions 路径节点,无论两者之间间隔多少层子目录,都会被命中
双层检索效率优化版
如果你的目录树体量很大,单命令遍历全路径会比较慢,可以用双层find的写法,先定位所有cromwell-executions目录,再在每个目录内部定向找inputs,减少无效遍历:
find . -type d -name "cromwell-executions" -exec find {} -type d -name "inputs" -print \;
第二步:执行删除操作
确认预检输出无误差后,将命令末尾的检索动作替换为删除动作即可:
单命令版直接替换-print为删除参数:
find . -type d -name "inputs" -path "*/cromwell-executions/*" -delete
如果系统 find 版本较老不支持 -delete 参数,使用兼容写法:
find . -type d -name "inputs" -path "*/cromwell-executions/*" -exec rm -rf {} +
双层检索版的删除命令,直接在第二层find里加删除动作即可:
find . -type d -name "cromwell-executions" -exec find {} -type d -name "inputs" -exec rm -rf {} \; \;
常见踩坑提醒
- 不要写固定深度的检索规则,比如
find ./cromwell-executions/*/inputs -delete,这类写法仅能匹配一层深度的 inputs 文件夹,遇到多层嵌套就会漏检 - 注意路径过滤条件的边界:匹配到的inputs文件夹必须是在cromwell-executions目录内部的,路径上和cromwell-executions同级的同名inputs会被自动排除,不会被误删
- 不要随意给find加
-prune参数匹配cromwell-executions目录:prune的作用是阻止find进入目标目录,会直接导致你无法检索cromwell-executions内部的内容,和你的需求完全相反 - 预检环节务必逐行核对输出路径,避免因为目录名拼写差异导致误删
内容的提问来源于stack exchange,提问作者Cindy Almighty
相关产品推荐
相关产品推荐

