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
逻辑拆解:
- 第一部分
find . -type d -name "stage":找到所有名为stage的目录 xargs -I {}:把每个找到的stage目录路径替换成{},传给第二个find- 第二个
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有两个问题:
**是bash的glob扩展,不是find的语法,如果没开启globstar,它和普通的*没区别,只会匹配一级目录- 即使开启了
globstar,find的第一个参数是起始路径,./**/stage/会被bash展开成所有stage目录的路径,这时候find会在这些目录下找values.yaml,写法绕了弯路,而且不如-path直接可靠
内容的提问来源于stack exchange,提问作者David Oceans
相关产品推荐
相关产品推荐

