이것은 기본적인 질문이지만 bash 경험이 없기 때문에 이 작업을 수행하는 데 어려움을 겪고 있습니다.
나에게 Directory_1 디렉터리가 있고 이 디렉터리에 cen1.yaml 및 cen2.yaml이 있다고 가정합니다. cen1.yaml에는 name이라는 필드가 있습니다.
name:xxxx
cen2.yaml의 내용은 다를 수 있습니다(예).
service:ser1
image:
field1:field1
field2:field2
.
.
.
첫 번째 반복에는 빈 Final.yaml이 있습니다. 하지만 저는 이 파일이 cen1.yaml의 이름을 갖고 cen2의 모든 항목이 그러한 이름을 갖기를 원합니다.
xxxx:
service:ser1
image:
field1:field1
field2:field2
.
.
.
다음으로, 동일한 파일 이름(cen1.yaml 및 cen2.yaml)을 가진 다른 디렉터리를 복제하겠습니다. Cen1.yaml에는 다시 이름 필드가 있습니다.
name:another
그리고 cen2.yaml에는 자체 콘텐츠가 있습니다.
tv:lcd
name:
field1:field1
field2:field2
.
.
.
이제 기존 파일에 추가하고 동일한 구조를 유지해야 합니다.
xxxx:
service:ser1
image:
field1:field1
field2:field2
.
.
.
another
tv:lcd
mount:
field1:field1
field2:field2
.
.
.
따라서 두 가지 경우에 작동하는 명령이 필요합니다. 파일이 비어 있고 첫 번째 반복을 작성하는 경우 또는 파일에 이미 내용이 있고 내용이 추가되는 경우입니다. 이 목표를 어떻게 달성할 수 있나요?
답변1
yq
다음은 이름을 로드하여 내부 변수 cen1.yaml
에 넣는 Mike Farah의 표현입니다 . 그런 다음 아래 제공된 키를 사용하여 새 YAML 문서를 생성하고 해당 문서에 로드합니다 .yq
$name
cen2.yaml
$name
load("cen1.yaml").name as $name | .[$name] = load("cen2.yaml")
이를 사용하여 여러 하위 디렉터리를 반복하고, yq
각 하위 디렉터리에 적용하고, 거기에서 출력을 수집할 수 있습니다 final.yaml
. 이 코드는 디렉터리가 모두 파일 이름 와일드카드 패턴과 일치한다고 가정합니다 directory_*
.
for dir in directory_*; do
(
cd "$dir" &&
yq -n 'load("cen1.yaml").name as $name | .[$name] = load("cen2.yaml")'
)
done >final.yaml
명령줄에 제공된 파일을 사용하지 않기 때문에 -n
with를 사용합니다 .yq
질문의 데이터를 고려하면(점선을 제거하고 각 뒤에 공백을 삽입하여 수정됨 :
) 다음과 같은 YAML 파일이 생성됩니다.
xxxx:
service: ser1
image:
field1: field1
field2: field2
another:
tv: lcd
name:
field1: field1
field2: field2
모든 디렉터리를 동시에 사용할 수 없는 경우 final.yaml
비트를 추가하여 파일을 빌드할 수 있습니다.
rm -f final.yaml
# Get directory_1, and then...
(
cd directory_1 &&
yq -n 'load("cen1.yaml").name as $name | .[$name] = load("cen2.yaml")'
) >>final.yaml
# Get directory_2, and then...
(
cd directory_2 &&
yq -n 'load("cen1.yaml").name as $name | .[$name] = load("cen2.yaml")'
) >>final.yaml
# etc.
...기본적으로 루프의 각 반복을 수동으로 실행하고 각 단계의 결과 파일에 출력을 추가합니다.
같은 일이지만 Andrey Kislyuk의 yq
(래퍼 jq
)를 사용합니다.
for dir in directory_*; do
(
cd "$dir" &&
yq -n -y 'input.name as $name | .[$name] = inputs' cen1.yaml cen2.yaml
)
done >final.yaml