我需要将多个k8s部署yaml文件合并到一个部署脚本中,并在每个文件之间创建一个特定的分隔符---
。我知道文件和文件名的生存深度,但是我不知道在给定时间会有多少文件,因此我将下面的find
语句用于
tail
命令以分隔符的形式 find . -type f -name 'deployment.yml' -exec cat {} + | tail -n +1 * > finalDeployment.yml
但是,这会通过插入==> <==
分隔符来创建损坏的yaml语法:
我可以简单地让另一个任务使用上述作为前缀/后缀标记来运行查找/替换,但是我想在上面的语句中更简洁一些。
是否可以在cat
命令中将特定字符/一组字符传递给定界符,还是有另一种方法来实现?
答案 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