#!/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 '%s' "${path#*/}" "${path##*/}" # суффикс текущего элемента — размер файла меньшим шрифтом [ -f "$path" ] && printf ' %s' \ "$(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' "## Дерево каталогов" "" "
" \
    "$(directory_tree . | grep '\S')" "
" >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)) мс."