bash 迭代多个目录以构建一个 yaml 文件

bash 迭代多个目录以构建一个 yaml 文件

我有一个包含多个文件夹的目录(仅对一层文件夹感兴趣),并且每个文件夹中都有文件(values.yaml 和 example.yaml)

folder_1
 -values.yaml
 -example.yaml

folder_2
 -values.yaml
 -example.yaml
...

value.yaml 是一个有效的 yaml 文件,包含多个值

文件夹 1 的 value.yaml 示例

name: John
age: 66
country:
  name: Spain
  lenght: 32
...

文件夹 2 的 value.yaml 示例

name: Simon
age: 90
country:
  name: France
  lenght: 33
...

我必须迭代这些目录中的每一个并构建一个 yaml 文件,在其中将文件夹名称与特定字符串(例如:-batch)连接起来,并将此文件夹中的 value.yaml 中的所有值放入该字段内

最终输出示例

folder_1-batch
  name: John
  age: 66
  country
    name:Spain
    lenght: 32
  ...

folder_2-batch
  name: Simon
  age: 90
  country:
    name: France
    lenght: 33
  ...
 

我有什么想法可以做到这一点吗?我能够将每个 value.yaml 中的所有内容复制到一个新文件中,但我不明白如何将此内容放入主字段(与 -batch 连接的文件夹)中,并使用 yaml 文件的正确缩进


小更新:文件夹可以有任何名称,并且不遵循任何模式(folder_1 和folder_2 只是一个示例)

答案1

使用yq来自https://kislyuk.github.io/yq/

shopt -s nullglob
for pathname in */values.yaml; do
    yq -y --arg name "${pathname%/*}-batch" '{ ($name): . }' "$pathname"
done >output.yaml

nullglob如果没有匹配的名称,这首先可以避免运行后续循环。

该循环迭代values.yaml当前目录的所有一级子目录中的所有文件。

对于每个文件,yq调用 来将文件的内容合并到内部变量 给定的键下,该变量从命令行$name获取其值。--arg该变量的值将是目录名称后跟字符串-batch

所有输出都写入文件output.yaml

测试:

$ tree
.
├── folder1
│   └── values.yaml
└── folder2
    └── values.yaml

2 directories, 2 files
$ shopt -s nullglob
$ for pathname in */values.yaml; do yq -y --arg name "${pathname%/*}-batch" '{ ($name): . }' "$pathname"; done >output.yaml
$ cat output.yaml
folder1-batch:
  name: John
  age: 66
  country:
    name: Spain
    lenght: 32
folder2-batch:
  name: Simon
  age: 90
  country:
    name: France
    lenght: 33

答案2

循环文件夹,用于sed缩进每个 YAML 文件。

#!/bin/bash
for d in folder_* ; do
    echo "$d"-batch
    sed 's/^/  /' "$d"/values.yaml
done > output.yaml

相关内容