Bash

bash 遍歷多個目錄以建構一個 yaml 文件

  • August 27, 2022

我有一個目錄,裡面有幾個文件夾(只對一層深的文件夾感興趣),每個文件夾裡面都有文件(values.yaml 和 example.yaml)

folder_1
-values.yaml
-example.yaml

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

values.yaml 是具有多個值的有效 yaml 文件

文件夾 1 的 values.yaml 範例

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

文件夾 2 的 values.yaml 範例

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

我必須遍歷這些目錄中的每一個並建構一個 yaml 文件,在其中我將文件夾名稱與某個字元串(例如:-batch)連接起來,並將該文件夾中 values.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
 ...

任何想法我怎麼能做到這一點?我能夠將每個 values.yaml 中的所有內容複製到一個新文件中,但我不明白如何使用正確的 yaml 文件縮進將此內容放入主欄位(與 -batch 連接的文件夾)中


小更新:文件夾可以有任何名稱,並且不遵循任何模式(folder_1 和 folder_2 只是一個範例)

遍歷文件夾,用於sed縮進每個 YAML 文件。

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

yqhttps://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目前目錄的所有 1 級子目錄中的所有文件。

對於每個文件,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

引用自:https://unix.stackexchange.com/questions/715032