生成一个分层降价列表,其元素是指向我的 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 存储库中文件的链接?的主要内容,如果未能解决你的问题,请参考以下文章

如何将分层列表排序为字典的树/pyrimid 模型?

Python生成器

golang切片类型

外媒所言非虚,苹果降价或许是真的在清库存

如何从 STL 列表中的迭代器访问指向结构的指针而不是其元素

列表的复制