生成一个分层降价列表,其元素是指向我的 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)
我正在尝试创建一个 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)