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

3.6 KiB
Raw Blame History

Дерево каталогов со ссылками

Напишем скрипт Bash для создания файла DIRECTORY-TREE.md в корне репозитория со ссылками на его объекты. Будем использовать полученный файл для навигации по репозиторию в вёб-интерфейсе.

1. Выполняем программу tree и получаем дерево каталогов в текстовом виде, где для каждогофайла указываем полный префикс пути Linux от корня репозитория. Папки выводим перед файлами и применяем буквенно-цифровую сортировку. Исключаем файлы и папки, которых не должно быть в репозитории. Полученное дерево помещаем в блок <pre> и добавляем заголовок.

Дерево каталогов

2. Для красоты, веточки-рамки у дерева box-drawing делаем короче. Для замены подстрок используем программу sed и регулярные выражения. Пробельные символы заменяем на пробелы. Пошагово формируем файл DIRECTORY-TREE.md.

Дерево каталогов

3. Далее выполняем программу find и получаем список файлов и каталогов Linux, сортируем этот список в обратном порядке от самого длинного пути до самого короткого, т. е. вложенные файлы будут перед их каталогами, чтобы не получилось заменить только часть пути. Затем обходим отсортированный список и заменяем в полученном дереве относительный путь Linux на относительную ссылку HTTP в теге <a> и именем файла в представлении ссылки.

Дерево каталогов

4. Получаем файл DIRECTORY-TREE.md для вёб-интерфейса репозитория — Markdown преобразованный в HTML.

Дерево каталогов


directory-tree.sh

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