61 lines
3.3 KiB
Bash
Executable file
61 lines
3.3 KiB
Bash
Executable file
#!/bin/bash
|
||
echo "Построение дерева каталогов для каждого проекта и копирование файлов лицензии."
|
||
# дерево каталогов со ссылками
|
||
function directory_tree {
|
||
# аргументы
|
||
local path="$1"
|
||
local head="$2"
|
||
local tail="$3"
|
||
# получить содержимое каталога
|
||
if [ -d "$path" ]; then
|
||
# сначала заглавные буквы, потом строчные, сначала каталоги, потом файлы
|
||
ls_sorted="LC_COLLATE=C ls -A --group-directories-first $exclusions $path"
|
||
# отсортированный массив файлов и каталогов
|
||
local list && readarray -t list < <(eval "$ls_sorted")
|
||
# длина массива
|
||
local size=${#list[@]}
|
||
# пропустить пустой каталог
|
||
[ "$size" == 0 ] && return
|
||
fi
|
||
# префикс текущего элемента, сворачивать синглтоны в одну строку
|
||
[ "$4" == "one" ] && printf '%s' "/" || printf '\n%s' "$head"
|
||
# текущий элемент дерева — относительная гиперссылка
|
||
printf '<a href="%s">%s</a>' "${path#*/}" "${path##*/}"
|
||
# суффикс текущего элемента — размер файла меньшим шрифтом
|
||
[ -f "$path" ] && printf '<small> %s</small>' \
|
||
"$(stat -c %s "$path" | numfmt --to=iec --round=nearest)"
|
||
# рекурсивные вызовы для подкаталогов
|
||
if [ -d "$path" ]; then
|
||
local i # счётчик
|
||
for ((i = 0; i < size; i++)); do
|
||
if ((size == 1)); then
|
||
directory_tree "$path/${list[$i]}" "$tail" "$tail" "one"
|
||
elif ((i < size - 1)); then
|
||
directory_tree "$path/${list[$i]}" "$tail├─ " "$tail│ "
|
||
else
|
||
directory_tree "$path/${list[$i]}" "$tail└─ " "$tail "
|
||
fi
|
||
done
|
||
fi
|
||
}
|
||
# копирование файлов лицензии и построение дерева каталогов
|
||
function tree_license {
|
||
echo "Обработка: $1"
|
||
cd "$1" || return
|
||
# копирование файлов из этого репозитория во все остальные
|
||
if [ "$1" != "./dispatcher" ]; then
|
||
cp --remove-destination ../dispatcher/CONTRIBUTING.md .
|
||
cp --remove-destination ../dispatcher/*LICENSE* .
|
||
fi
|
||
# строка исключений для "ls" из списка неотслеживаемых файлов ".gitignore"
|
||
exclusions="-I'.git' $(sed -E "s|^(.*)$|-I'\1'|" .gitignore | tr '\n' ' ')"
|
||
# поместить дерево в контейнер, добавить заголовок и вывести в файл
|
||
printf '%s\n' "## Дерево каталогов" "" "<pre>" \
|
||
"$(directory_tree . | grep '\S')" "</pre>" >DIRECTORY_TREE.md
|
||
}
|
||
export -f tree_license directory_tree
|
||
cd ../.. # выход из папки и из репозитория
|
||
time_ms="$(date '+%s%3N')"
|
||
# поиск всех каталогов на одном уровне с текущим, кроме папки ".idea", и параллельный запуск функции для каждого
|
||
find . -mindepth 1 -maxdepth 1 -type d -not -name ".idea" -printf 'tree_license "%p"\0' | xargs -n1 -0 -P0 bash -c
|
||
echo "Общее время выполнения: $(($(date '+%s%3N') - time_ms)) мс."
|