bash는 여러 디렉터리를 반복하여 yaml 파일을 만듭니다.

bash는 여러 디렉터리를 반복하여 yaml 파일을 만듭니다.

여러 폴더가 있는 디렉터리(한 수준의 폴더에만 관심 있음)가 있고 각 폴더에 파일(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

답변2

sed각 YAML 파일을 들여쓰기 위한 루프 폴더입니다 .

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

관련 정보