Bash
bash 遍歷多個目錄以建構一個 yaml 文件
我有一個目錄,裡面有幾個文件夾(只對一層深的文件夾感興趣),每個文件夾裡面都有文件(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
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
目前目錄的所有 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