57 lines
3 KiB
Bash
Executable file
57 lines
3 KiB
Bash
Executable file
#!/bin/bash
|
||
echo "Построение дерева каталогов для каждого проекта и копирование файлов лицензии."
|
||
# отсортированный список файлов и каталогов
|
||
function list_directory_contents {
|
||
# сначала заглавные буквы, потом строчные, сначала каталоги, потом файлы
|
||
eval "LC_COLLATE=C ls -A --group-directories-first $exclusions $1"
|
||
}
|
||
# дерево каталогов со ссылками
|
||
function directory_tree {
|
||
# аргументы
|
||
local path="$1"
|
||
local head="$2"
|
||
local tail="$3"
|
||
# префикс для текущего элемента
|
||
[ "one" == "$4" ] && printf '%s' "/" || printf '\n%s' "$head"
|
||
# текущий элемент дерева
|
||
printf '%s' "<a href='${path#*/}'>${path##*/}</a>"
|
||
# рекурсивные вызовы для подкаталогов
|
||
if [ -d "$path" ]; then
|
||
local list # массив файлов и каталогов
|
||
readarray -t list < <(list_directory_contents "$path")
|
||
local size=${#list[@]} # длина массива
|
||
local i # счётчик
|
||
for ((i = 0; i < size; i++)); do
|
||
if [ -z "${list[$i]}" ]; then
|
||
continue # пропустить пустой каталог
|
||
elif ((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" != "./pomodoro" ]; then
|
||
cp -f ../pomodoro/CONTRIBUTING.md .
|
||
cp -f ../pomodoro/*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 list_directory_contents
|
||
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)) мс."
|