1
0
Fork 0
pomodoro/draft/2023-06-13-directory-tree.md
2023-12-17 07:53:27 +03:00

75 lines
3.6 KiB
Bash
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Дерево каталогов со ссылками
Напишем скрипт Bash для создания файла [`DIRECTORY-TREE.md`](../DIRECTORY-TREE.md) в корне репозитория со
ссылками на его объекты. Будем использовать полученный файл для навигации по репозиторию в вёб-интерфейсе.
<details>
<summary>
<b>1.</b> Выполняем программу <code>tree</code> и получаем дерево каталогов в текстовом виде, где для
каждогофайла указываем полный префикс пути Linux от корня репозитория. Папки выводим перед файлами и
применяем буквенно-цифровую сортировку. Исключаем файлы и папки, которых не должно быть в репозитории.
Полученное дерево помещаем в блок <code>&lt;pre&gt;</code> и добавляем заголовок.
</summary>
![Дерево каталогов](../pictures/directory-tree1.jpg)
</details>
<details>
<summary>
<b>2.</b> Для красоты, веточки-рамки у дерева box-drawing делаем короче. Для замены подстрок используем
программу <code>sed</code> и регулярные выражения. Пробельные символы заменяем на пробелы. Пошагово
формируем файл <code>DIRECTORY-TREE.md</code>.
</summary>
![Дерево каталогов](../pictures/directory-tree2.jpg)
</details>
<details>
<summary>
<b>3.</b> Далее выполняем программу <code>find</code> и получаем список файлов и каталогов Linux, сортируем
этот список в обратном порядке от самого длинного пути до самого короткого, т. е. вложенные файлы будут перед
их каталогами, чтобы не получилось заменить только часть пути. Затем обходим отсортированный список и заменяем
в полученном дереве относительный путь Linux на относительную ссылку HTTP в теге <code>&lt;a&gt;</code> и именем
файла в представлении ссылки.
</summary>
![Дерево каталогов](../pictures/directory-tree3.jpg)
</details>
<details>
<summary>
<b>4.</b> Получаем файл <code>DIRECTORY-TREE.md</code> для вёб-интерфейса репозитория — Markdown преобразованный в HTML.
</summary>
![Дерево каталогов](../pictures/directory-tree4.jpg)
</details>
---
<details open>
<summary><h3 id="directory-tree.sh">directory-tree.sh</h3></summary>
```bash
#!/bin/bash
echo "Построение дерева каталогов со ссылками."
{
echo "## Дерево каталогов"
echo
echo "<pre>"
tree -nvf --dirsfirst -I "*.gem|*.lock|*.zip|_site*" --noreport
echo "</pre>"
} >DIRECTORY-TREE.md
sed -i -e "s/ / /g" -e "s/ / /g" -e "s/──/─/g" DIRECTORY-TREE.md
find . -mindepth 1 -type f,d -not -regex '.*\.\(gem\|lock\|zip\)\|.*/\(\.\|_site\).*' | sort -r | while read -r file; do
echo "Обработка: \\$file >> ${file#*/} >> ${file##*/}"
sed -i "s|\\$file|<a href='${file#*/}'>${file##*/}<\/a>|g" DIRECTORY-TREE.md
done
```
</details>
---