使用分隔符连接多个Yaml文件

时间:2019-05-08 19:56:31

标签: linux find yaml concatenation cat

我需要将多个k8s部署yaml文件合并到一个部署脚本中,并在每个文件之间创建一个特定的分隔符---。我知道文件和文件名的生存深度,但是我不知道在给定时间会有多少文件,因此我将下面的find语句用于

  1. 递归搜索yaml文件
  2. 相互吸引
  3. 通过tail命令以分隔符的形式

find . -type f -name 'deployment.yml' -exec cat {} + | tail -n +1 * > finalDeployment.yml

但是,这会通过插入==> <==分隔符来创建损坏的yaml语法:

enter image description here

我可以简单地让另一个任务使用上述作为前缀/后缀标记来运行查找/替换,但是我想在上面的语句中更简洁一些。

是否可以在cat命令中将特定字符/一组字符传递给定界符,还是有另一种方法来实现?

1 个答案:

答案 0 :(得分:0)

不能保证您要执行的操作。例如,您有以下两个YAML文件:

foo: bar

和:

%YAML 1.2
---
baz

如您所见,第二个文件包含一个指令。它还显示YAML中的---不是分隔符,而是指令结束标记。如果您没有第一个文档中的任何指令,则它是可选的。如果以您希望的方式将两个文档连接在一起,则会得到一个包含两个---%YAML 1.2的文档,因为它们出现在指令结束标记之后。

因此,您实际要做的是用...文档结束标记)标记每个文档的结尾。在该标记之后,解析器将重置为初始状态,从而确保第二个文档的解析与在单独文件中时的解析完全相同。

此外,将...添加到最后一个文档不会造成任何危害,因为它不会隐式启动另一个文档。因此,您的命令可能看起来像这样(我取决于您的声明,即您知道文件位于此处的深度,例如,预期深度为3个目录):

echo -n > finalDeplayment.yml
for f in */*/*/deployment.yml; do
  cat $f >> finalDeployment.yml; echo "..." >> finalDeployment.yml
done