You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash中如何查找任意层级stage目录下values.yaml的指定内容

解决任意层级stage目录下values.yaml的搜索问题

没问题,这个需求其实用find的原生选项就能轻松解决,我来给你拆解下正确的写法和背后的原因:

方法一:用find的-path精准匹配(最可靠)

这是兼容性最好的写法,不管你的shell配置如何都能生效:

find . -type f -path "*/stage/values.yaml" | xargs grep -E 'port|target' --color=auto

关键参数解释:

  • -type f:确保我们只找文件,避免把同名的目录也匹配进来
  • -path "*/stage/values.yaml":核心规则,匹配任意层级路径下,刚好位于stage目录下的values.yaml,不管stage在第3级还是第N级都能命中
  • grep部分用-E 'port|target'替代多个-e参数,写法更简洁;--color=auto让颜色只在终端输出时生效,避免管道输出时出现乱码的颜色控制字符

方法二:先定位所有stage目录,再找里面的values.yaml

如果你想更明确地先锁定所有stage目录,再在其中找文件,可以用嵌套find:

find . -type d -name "stage" | xargs -I {} find {} -maxdepth 1 -name "values.yaml" -type f | xargs grep -E 'port|target' --color=auto

逻辑拆解:

  1. 第一部分find . -type d -name "stage":找到所有名为stage的目录
  2. xargs -I {}:把每个找到的stage目录路径替换成{},传给第二个find
  3. 第二个find {} -maxdepth 1:只在stage目录的直接子级找values.yaml,不会递归到stage的子目录里(如果你不需要这个限制,可以去掉-maxdepth 1)

方法三:用bash的globstar扩展(更简洁)

如果你的bash版本是4.0及以上(大部分现代系统都满足),可以开启globstar选项,用更简洁的glob写法:

# 先开启globstar(如果没开的话)
shopt -s globstar
# 直接搜索
grep -E 'port|target' --color=auto **/stage/values.yaml

这里的**是bash的特殊glob,开启globstar后会匹配任意层级的目录,所以**/stage/values.yaml直接就能定位到所有层级stage目录下的目标文件。

为什么你之前的写法不生效?

你尝试的find ./**/stage/ -name values.yaml有两个问题:

  1. **是bash的glob扩展,不是find的语法,如果没开启globstar,它和普通的*没区别,只会匹配一级目录
  2. 即使开启了globstar,find的第一个参数是起始路径,./**/stage/会被bash展开成所有stage目录的路径,这时候find会在这些目录下找values.yaml,写法绕了弯路,而且不如-path直接可靠

内容的提问来源于stack exchange,提问作者David Oceans

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 08:53:11