生成一个分层降价列表,其元素是指向我的 git 存储库中文件的链接?
Posted
技术标签:
【中文标题】生成一个分层降价列表,其元素是指向我的 git 存储库中文件的链接?【英文标题】:generate a hierarchical markdown list whose elements are links to files in my git repository? 【发布时间】:2021-06-19 13:42:30 【问题描述】:我正在尝试创建一个 git 挂钩,它会生成一个 readme.md
文件,该文件包含一个“索引”,其中只有 .c 文件作为我的课堂作业的一部分被链接。目录树是这样的
$ tree
├── assignment1
│ ├── linear_lists.c
| |── circular_lists.c
| |── main.c
├── assignment2
│ ├── stacks.c
│ ├── main.c
| ...
└── readme.md
到目前为止,我只知道如何为单层列表生成代码
* [assignment1/linear_lists.c](https://raw.githubusercontent.com/me/myrepo/main/assignment1/linear_lists.c)
* [assignment1/circular_lists.c](/https://raw.githubusercontent.com/me/myrepo/main/assignment1/circular_lists.c)
...
* [assignment2/stacks.c](https://raw.githubusercontent.com/me/myrepo/assignment2/stacks.c)
...
使用:
find . -name "*.c" | sed "s|^\./\(.*\)|* \[\1\]($url/$repo/$branch/\1)|" >> readme.md
我想通过基本上生成以下代码将上述内容表示为两级降价列表(如果可能,仅使用 Unix 实用程序)
* assignment1 <!-- name of parent -->
+ [linear_lists.c](same link as above)
+ [circular_lists.c](same link as above)
...
* assignment2
+ [stacks.c](same link as above)
...
这可能吗?任何帮助表示赞赏。
【问题讨论】:
【参考方案1】:请您尝试以下方法:
#!/bin/bash
prefix="https://raw.githubusercontent.com/me/myrepo/main"
for d in */; do # find directories in the current directory
d=$d%/ # remove a trailing slash
printf "* %s\n" "$d" # print the name of parent
for f in "$d"/*; do # find files in each directory
f=$f#*/ # remove dirname to extract the filename
printf " + [%s](%s)\n" "$f" "$prefix/$d/$f"
# print tha name of child and the link
done
done > readme.md
生成readme.md
:
* assignment1
+ [circular_lists.c](https://raw.githubusercontent.com/me/myrepo/main/assignment1/circular_lists.c)
+ [linear_lists.c](https://raw.githubusercontent.com/me/myrepo/main/assignment1/linear_lists.c)
+ [main.c](https://raw.githubusercontent.com/me/myrepo/main/assignment1/main.c)
* assignment2
+ [main.c](https://raw.githubusercontent.com/me/myrepo/main/assignment2/main.c)
+ [stacks.c](https://raw.githubusercontent.com/me/myrepo/main/assignment2/stacks.c)
请注意,上面的脚本专门用于两级目录树。如果我们需要更多关卡,我们需要修改脚本。
【讨论】:
【参考方案2】:这是一个将 find
输出转换为 Markdown 的 awk 脚本
带有链接的列表列表。
用作:
find DIR -type f \( -name '*.[ch]' -o -name '*.cpp' \) |
sort -t '/' -k 1 -k 2 |
awk -v base=BASE -f path/to/script
在哪里
目录是 .或 dirname,为获得紧凑的结果,请避免使用 '/'s 排序步骤是可选的 BASE 是路径前缀,例如'https://example.org/pub/'BEGIN
FS = "/"
levelindent = 4
split("*+-*+-*+-*+-*+-*+-",liststyle,//)
sub(/^\.\//,"",$0)
depth = NF-1
filename = $(NF)
path = $0; sub(/[^/]*$/,"",path)
## print each path part on first dir entry
accpath = ""
for ( d = 1; d <= depth; d++ )
accpath = accpath $(d) "/"
if ( ! seen[accpath]++ )
printf("%*s %s %s\n", levelindent*(d-1), "", \
liststyle[d], $(d) "/")
printf("%*s %s [%s](%s)\n", levelindent*(depth), "", \
liststyle[depth+1], filename, base path filename)
每个路径名 ($0
) 都被去除任何前导 ./
并拆分
由 /
作为字段分隔符 (FS
) 使用字段数 (NF
)
确定目录深度 (NF-1
) 和文件名 ($(NF)
)。
通过剥离文件名形成路径。
路径中的每个目录($1
到 $(NF-1)
) - 仅在第一次遇到时 -
并且文件名是输出
作为一个 Markdown 列表项,每个叶子节点作为一个 Markdown 链接
连接基(从命令行)、路径和文件名。
使用 printf
宽度标志处理缩进(%*s
中的 *
)
输出指定宽度的空格填充字段,随
目录深度。
编辑:支持无文件目录,添加说明
输出:
* week/
+ assignment1/
- [linear_lists.c](/pub/week/assignment1/linear_lists.c)
- [main.c](/pub/week/assignment1/main.c)
- supp/
* [supp.c](/pub/week/assignment1/supp/supp.c)
* extra/
+ [extra.h](/pub/week/assignment1/supp/extra/extra.h)
+ [extra.c](/pub/week/assignment1/supp/extra/extra.c)
- [circular_lists.c](/pub/week/assignment1/circular_lists.c)
+ assignment2/
- [stacks.c](/pub/week/assignment2/stacks.c)
- [stacks.h](/pub/week/assignment2/stacks.h)
- [main.c](/pub/week/assignment2/main.c)
- extra/
* [extra.c](/pub/week/assignment2/extra/extra.c)
【讨论】:
以上是关于生成一个分层降价列表,其元素是指向我的 git 存储库中文件的链接?的主要内容,如果未能解决你的问题,请参考以下文章