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