如何在paul和matt目录递归查找kustomization.yaml并执行多命令?
需求说明
我有paul和matt两个目录,各自包含若干子文件夹,其中可能存在或后续会出现kustomization.yaml文件。我需要在所有包含该文件的路径下执行多条命令,手动操作示例如下:
cd paul somecommand1 kustomization.yaml somecommand2 kustomization.yaml cd paul/test somecommand1 kustomization.yaml somecommand2 kustomization.yaml cd paul/test/test1 somecommand1 kustomization.yaml somecommand2 kustomization.yaml --- cd matt somecommand1 kustomization.yaml somecommand2 kustomization.yaml cd matt/test somecommand1 kustomization.yaml somecommand2 kustomization.yaml cd matt/test/test1 somecommand1 kustomization.yaml somecommand2 kustomization.yaml
我正在学习Bash,想要编写一个能在GitLab流水线中调用的脚本,通过递归查找这两个目录中的kustomization.yaml文件,对每个找到的文件执行x、y、z命令。
解决方案
使用find递归查找目标文件,结合循环处理每个文件所在目录,批量执行指定命令。
完整Bash脚本
#!/bin/bash # 指定要扫描的根目录 ROOT_DIRS=("paul" "matt") # 定义需要执行的命令(替换为你的x、y、z命令) EXEC_COMMANDS=( "somecommand1 kustomization.yaml" "somecommand2 kustomization.yaml" # 可继续添加更多命令,格式保持一致 ) # 遍历每个根目录 for root in "${ROOT_DIRS[@]}"; do # 递归查找所有kustomization.yaml文件 find "$root" -type f -name "kustomization.yaml" | while read -r yaml_path; do # 获取文件所在目录 yaml_dir=$(dirname "$yaml_path") # 进入目标目录,失败则跳过当前文件 cd "$yaml_dir" || { echo "警告:无法进入目录 $yaml_dir,跳过"; continue; } # 依次执行所有命令 for cmd in "${EXEC_COMMANDS[@]}"; do echo "执行命令: $cmd (目录: $yaml_dir)" # 执行命令,若需忽略错误可在末尾加 || true eval "$cmd" done # 返回脚本初始目录,避免路径混乱 cd - > /dev/null done done
核心细节解释
find命令:-type f确保只匹配文件(排除同名目录),-name "kustomization.yaml"精准定位目标文件,自动递归遍历所有子文件夹。- 目录切换:找到文件后先进入其所在目录,执行完命令后用
cd -返回脚本启动目录,避免后续循环出现路径错误。 - 命令数组:把需要执行的命令放在数组中,便于统一修改和扩展,替换数组内的内容即可适配你的实际需求。
- 错误处理:
cd "$yaml_dir" || { ... }捕获目录无法进入的异常,避免脚本直接中断。
GitLab流水线集成
将脚本保存为process_kustomizations.sh,在你的.gitlab-ci.yml中添加以下阶段:
process-kustomizations: stage: deploy # 根据你的流水线流程调整阶段名称 script: - chmod +x process_kustomizations.sh - ./process_kustomizations.sh
内容的提问来源于stack exchange,提问作者Tate_87
相关产品推荐
相关产品推荐

