複数のフォルダがあるディレクトリ(1レベルのフォルダにのみ興味があります)があり、各フォルダにファイル(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
...
これらの各ディレクトリを繰り返し、フォルダ名を特定の文字列(-batchなど)に関連付け、value.yamlのすべての値をこのフィールド内のこのフォルダに入れる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 のすべてのコンテンツを新しいファイルにコピーできますが、このコンテンツを yaml ファイルの正しいインデントを使用してデフォルトのフィールド (-batch に関連付けられたフォルダー) に入れる方法を理解していません。
小規模アップデート:フォルダは任意の名前を持つことができ、パターンには従わない(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