生成一个分层降价列表,其元素是指向我的 git 存储库中文件的链接?

generate a hierarchical markdown list whose elements are links to files in my git repository?

我正在尝试创建一个 git 挂钩,它生成一个 readme.md 文件,其中包含一个“索引”,其中只有 .c 文件,作为我的 class 作业的一部分, 有关联。目录树看起来像这样

$ 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|^\./\(.*\)|* \[\]($url/$repo/$branch/)|" >> 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)
...

这可能吗?感谢任何帮助。

请您尝试以下操作:

#!/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)

请注意上面的脚本专门用于二级目录树。如果我们需要更多的关卡,我们需要修改脚本。

这是一个将 find 输出转换为 Markdown 的 awk 脚本 links.

的列表列表

用作:

find DIR -type f \( -name '*.[ch]' -o -name '*.cpp' \) |
sort -t '/' -k 1 -k 2 |
awk -v base=BASE -f path/to/script

哪里

  • DIR 是 。或目录名,为了获得紧凑的结果,请避免使用 '/'s
  • 排序步骤是可选的
  • BASE 是路径前缀,例如'https://example.org/pub/'
BEGIN {
    FS = "/"
    levelindent = 4
    split("*+-*+-*+-*+-*+-*+-",liststyle,//)
}
{
    sub(/^\.\//,"",[=11=])
    depth = NF-1
    filename = $(NF)
    path = [=11=]; 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)
}

每个路径名 ([=14=]) 都被去除任何前导 ./ 并拆分 通过 / 作为字段分隔符 (FS) 使用字段数 (NF) 以确定目录深度 (NF-1) 和文件名 ($(NF))。 通过剥离文件名来创建路径。

路径中的每个目录(</code> 到 <code>$(NF-1)) - 仅在第一次遇到时 - 并输出文件名 作为 Markdown 列表项,每个叶节点作为 Markdown link 连接基础(来自命令行)、路径和文件名。

缩进使用 printf 宽度标志处理(%*s 中的 *) 输出指定宽度的 space 填充字段,随 目录深度。

编辑:支持无文件目录,添加说明

输出:

 * 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)