我想自动创建带有目录树列表的 Markdown,以便在每个目录中显示在在线存储库(如 GitHub)中。
因此,考虑到我要使用 Linux
tree
命令,可以使用 brew install tree
在 MacOS X 上安装(有关详细信息,请参阅此处),我提出了以下解决方案:
tree --dirsfirst --noreport -I README.md > README.md;sed -i '' '1s/^/```/' README.md;echo \ >> README.md; sed -i '' -e '$s/$/```/' README.md
其中第一个
sed -i '' '1s/^/```/' README.md
位于 ```
字符之前 – 请参阅 Mastering (Github) Markdown 了解有关支持的 Markdown 的详细信息。
echo
echo \ >> README.md;
正在添加换行符。请注意,这里我没有使用 sed
等效的 sed -i '' -e '$a\' filename
,因为这只会在由于 $a
模式而不存在时添加换行符(参见 here)。
最后一个
sed -i '' -e '$s/$/```/' README.md
正在向文件添加尾随 ```
。
tree
命令tree --dirsfirst --noreport -I README.md
将排除一些模式,将目录放在第一位,忽略报告文件和目录计数。
结果将类似于以下内容:
```.
├── bin
│ ├── Debug
│ │ ├── SampleLibrary.jar
│ │ ├── cooper.jar
│ │ ├── sugar.data.jar
│ │ ├── sugar.jar
│ │ └── swift.jar
│ └── Release
│ ├── SampleLibrary.jar
│ ├── cooper.jar
│ ├── sugar.data.jar
│ ├── sugar.jar
│ └── swift.jar
├── obj
│ ├── Debug
│ │ └── Android
│ │ ├── ClassLibrary2.elements.FilesWrittenAbsolute.txt
│ │ └── samplelibrary.jar
│ └── Release
│ └── Android
│ ├── ClassLibrary2.elements.FilesWrittenAbsolute.txt
│ └── samplelibrary.jar
├── ClassLibrary2.elements
└── ClassLibrary2.elements.user
```
你可以在这里看到这个markdown README.md。
此解决方案效率不高,并且仅限于
-I
的 tree
模式选项来过滤掉不需要的目录(比方说构建目录)或文件名等。此外,更新现有 README.md
也无法正常工作
降价。
该解决方案应该适用于 MacOS X(其中 sed 与 Linux 上的有一些差异)。
获取源代码标记的一种方法是将所有内容缩进四个空格:
tree --dirsfirst --noreport -I README.md | sed 's/^/ /' > README.md
按照您的方式操作,添加新的第一行和最后一行并在每行上添加
```
,我们可以这样做
tree --dirsfirst --noreport -I README.md |
sed '1s/^/```'$'\n''/;$s/$/'$'\n''```/' > README.md
在替换字符串中插入换行符是通过 C 样式转义完成的。或者,我们可以使用
"$(printf '\n')"
:
tree --dirsfirst --noreport -I README.md |
sed '1s/^/```'"$(printf '\n')"'/;$s/$/'"$(printf '\n')"'```/' > README.md
这些都应该与 macOS 上的 sed 一起使用。
使用 GNU sed,会简单一点:
tree --dirsfirst --noreport -I README.md |
sed '1s/^/```\n/;$s/$/\n```/' > README.md
看看这个python模块(我是作者)。
它动态生成描述性目录树,并且具有如下所示的 Markdown 导出格式:
.
├──
example_folder\
│ ├──
first_subfolder\
文档文件夹│ │ ├──
sub-sub1\
│ │ │ └── file3.sh
这是文件3│ │ ├──
sub-sub2\
│ │ │ └── file4.cpp
这是文件 4│ │ └── random_file.rdm
记录文件│ ├──
second_subfolder\
_文档化文件夹│ ├── a_text_file.txt
文本文件│ ├── my_javascript.js
这是文件1│ └── test.py
Python 脚本└── README.md
主要自述文件\
当然还有 ASCII
.
├── example_folder\
│ ├── first_subfolder\ (a documented folder)
│ │ ├── sub-sub1\
│ │ │ └── file3.sh (this is file 3)
│ │ ├── sub-sub2\
│ │ │ └── file4.cpp (this is file 4)
│ │ └── random_file.rdm (a documented file)
│ ├── second_subfolder\ (a documented folder with no documented files)
│ ├── a_text_file.txt (a text file)
│ ├── my_javascript.js (this is file 1)
│ └── test.py (a python script)
└── README.md (The main readme)
在 VSCode 中创建 Markdown 并从 Marketplace 添加 Ascii Tree Generator 扩展。
Avoid Overwriting README.md Directly:
不要直接覆盖 README.md 文件,而是考虑创建一个临时文件,然后在更改完成后将其移至 README.md。如果在此过程中出现问题,这有助于防止潜在的数据丢失。
tree --dirsfirst --noreport -I README.md > temp_tree.md
echo '```' >> temp_tree.md
mv temp_tree.md README.md
如果你想在 Markdown 的代码块中包含目录树,你应该在树结构之前和之后用三个反引号(```)包裹树输出。您提供的用于在树结构周围添加三个反引号的命令是正确的。
如果您要更新现有的 README.md 文件,请考虑保留文件中已有的其他内容。您可以使用命令组合将生成的树结构插入到现有文件中,而不完全覆盖它。
tree --dirsfirst --noreport -I README.md > temp_tree.md
echo '```' >> temp_tree.md
awk '/```/{flag=!flag}flag' README.md > temp_existing_content.md
cat temp_tree.md temp_existing_content.md > README.md
这组命令提取三个反引号之间的现有内容,然后将新的树结构与提取的内容连接起来。
注意:此处的 awk 命令查找包含三个反引号的行并切换标志,以便您提取它们之间的内容。