# Дерево каталогов со ссылками Напишем скрипт Bash для создания файла [`DIRECTORY-TREE.md`](../DIRECTORY-TREE.md) в корне репозитория со ссылками на его объекты. Будем использовать полученный файл для навигации по репозиторию в вёб-интерфейсе.
1. Выполняем программу tree и получаем дерево каталогов в текстовом виде, где для каждогофайла указываем полный префикс пути Linux от корня репозитория. Папки выводим перед файлами и применяем буквенно-цифровую сортировку. Исключаем файлы и папки, которых не должно быть в репозитории. Полученное дерево помещаем в блок <pre> и добавляем заголовок. ![Дерево каталогов](../pictures/directory-tree1.jpg)
2. Для красоты, веточки-рамки у дерева box-drawing делаем короче. Для замены подстрок используем программу sed и регулярные выражения. Пробельные символы заменяем на пробелы. Пошагово формируем файл DIRECTORY-TREE.md. ![Дерево каталогов](../pictures/directory-tree2.jpg)
3. Далее выполняем программу find и получаем список файлов и каталогов Linux, сортируем этот список в обратном порядке от самого длинного пути до самого короткого, т. е. вложенные файлы будут перед их каталогами, чтобы не получилось заменить только часть пути. Затем обходим отсортированный список и заменяем в полученном дереве относительный путь Linux на относительную ссылку HTTP в теге <a> и именем файла в представлении ссылки. ![Дерево каталогов](../pictures/directory-tree3.jpg)
4. Получаем файл DIRECTORY-TREE.md для вёб-интерфейса репозитория — Markdown преобразованный в HTML. ![Дерево каталогов](../pictures/directory-tree4.jpg)
---

directory-tree.sh

```bash #!/bin/bash echo "Построение дерева каталогов со ссылками." { echo "## Дерево каталогов" echo echo "
"
  tree -nvf --dirsfirst -I "*.gem|*.lock|*.zip|_site*" --noreport
  echo "
" } >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|${file##*/}<\/a>|g" DIRECTORY-TREE.md done ```
---