Linux 使用分隔符连接多个yaml文件

Linux 使用分隔符连接多个yaml文件,linux,find,yaml,concatenation,cat,Linux,Find,Yaml,Concatenation,Cat,我需要将多个k8s部署yaml文件合并到一个部署脚本中,并在每个文件之间创建一个特定的分隔符--。我知道文件的具体存放深度以及文件名,但我不知道在给定的时间会有多少个文件,因此我使用下面的find语句 递归搜索yaml文件 每只海螺 在tail命令中作为分隔符进行管道传输 find-键入f-name'deployment.yml'-exec cat{}+|tail-n+1*>finalDeployment.yml 但是,这会通过插入==>来创建损坏的yaml语法,您想要做的事情不能保证工作正常。

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

  • 递归搜索yaml文件
  • 每只海螺
  • tail
    命令中作为分隔符进行管道传输
  • find-键入f-name'deployment.yml'-exec cat{}+|tail-n+1*>finalDeployment.yml


    但是,这会通过插入
    ==>来创建损坏的yaml语法,您想要做的事情不能保证工作正常。例如,您有以下两个YAML文件:

    foo: bar
    
    以及:

    如您所见,第二个文件包含一个指令。它还显示YAML中的
    --
    不是分隔符,而是指令结束标记。如果没有像第一个文档中那样的任何指令,那么它是可选的。如果以您希望的方式连接两个文档,您将得到一个包含两个
    --
    %YAML 1.2
    的文档,因为它发生在指令结束标记之后,因此将被解释为内容

    因此,您实际上要做的是使用文档结束标记
    ,来标记每个文档的结束。在该标记之后,解析器被重置为其初始状态,这保证了第二个文档的解析与它在单独文件中时的解析完全相同

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


    很好,但为了安全起见,如果文件中还没有“--”和“…”这两个链接:引文:“理论上,也可以只使用文档结束标记来分隔文档:但是,并非所有库都支持这一点。为了安全起见,在使用多个文档时始终使用文档开始标记。”@pdem如果您尝试了这一点,而您的实现遇到了瓶颈,您可以在实现中提交一个bug,然后制定一个解决方案,但我认为先发制人地阻止符合规范的使用是不明智的;它贬低了规范的价值。
    %YAML 1.2
    ---
    baz
    
    echo -n > finalDeplayment.yml
    for f in */*/*/deployment.yml; do
      cat $f >> finalDeployment.yml; echo "..." >> finalDeployment.yml
    done