bashは複数のディレクトリを繰り返してyamlファイルを作成します。

bashは複数のディレクトリを繰り返してyamlファイルを作成します。

複数のフォルダがあるディレクトリ(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

おすすめ記事