![从嵌套(例如 yaml)目录结构生成完整路径](https://linux22.com/image/195607/%E4%BB%8E%E5%B5%8C%E5%A5%97%EF%BC%88%E4%BE%8B%E5%A6%82%20yaml%EF%BC%89%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84%E7%94%9F%E6%88%90%E5%AE%8C%E6%95%B4%E8%B7%AF%E5%BE%84.png)
我尝试在 shell/bash 中编写脚本,将 yaml 目录结构转换为完整路径(以进一步mkdir -p
实现)。 Yaml 是我的选择,因为它具有人类可编辑性。结构示例为:
- Downloads
- Music
- Movies
- University
- First year
- English
- Maths
- Second year
所以我想用当前目录(realpath .
)替换第一级,例如,,/home/maeda/Downloads
用父目录的完整路径(例如,/home/maeda/Downloads/Music
)替换第二级
所以我想达到这样的结果:
/home/maeda/Downloads
/home/maeda/Downloads/Music
/home/maeda/Downloads/Movies
/home/maeda/University
/home/maeda/University/First year
/home/maeda/University/First year/English
/home/maeda/University/First year/Maths
/home/maeda/University/Second year
如何实现?
答案1
假设您的 YAML 文件有效,例如
Downloads:
Music:
Movies:
University:
First year:
English:
Maths:
Second year:
你可以使用
yq -r --arg prefix "$(realpath .)" 'paths | [ $prefix, .[] ] | join("/")' file.yaml
从哪里来yq
https://kislyuk.github.io/yq/
这使用jq
表达式从文档中获取“路径”。此上下文中的“路径”是文档本身中任何特定条目的表示,因此数组的路径First year
就是数组[ 'University', 'First year' ]
(使用 JSON 表示法编写)。
这些路径数组可以使用 来连接/
作为分隔符join("/")
。
realpath .
我还将into的输出yq
作为内部变量的值传递$prefix
。在将路径数组传递给 之前,该值会添加到每个路径数组的前面join("/")
,这意味着它将被添加到命令输出的路径名的前面yq
。