我有一个包含多个文件夹的目录(仅对一层文件夹感兴趣),并且每个文件夹中都有文件(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