add readdir recursive and get content for files

This commit is contained in:
mirivlad 2025-11-24 16:33:16 +08:00
parent 9a08511980
commit be200a046f
1 changed files with 82 additions and 0 deletions

82
read_dir_content.sh Executable file
View File

@ -0,0 +1,82 @@
#!/bin/bash
# Параметры по умолчанию
output_file=""
exclude_dirs=()
target_dir="."
# Функция для вывода справки
usage() {
echo "Использование: $0 -o <output_file> [--exclude <dir1>] [--exclude <dir2>] [<target_dir>]"
echo "Пример: $0 -o project.txt --exclude vendor --exclude node_modules ."
exit 1
}
# Разбор аргументов командной строки
while [[ $# -gt 0 ]]; do
case $1 in
-o)
output_file="$2"
shift 2
;;
--exclude)
exclude_dirs+=("$2")
shift 2
;;
-*)
echo "Неизвестная опция: $1"
usage
;;
*)
target_dir="$1"
shift
;;
esac
done
# Проверка обязательных параметров
if [[ -z "$output_file" ]]; then
echo "Ошибка: Требуется указать выходной файл с помощью -o"
usage
fi
# Проверка существования целевой директории
if [[ ! -d "$target_dir" ]]; then
echo "Ошибка: Директория '$target_dir' не существует"
exit 1
fi
# Создание временного файла
temp_file=$(mktemp)
# Построение find команды с исключениями
find_command="find \"$target_dir\" -type f"
if [[ ${#exclude_dirs[@]} -gt 0 ]]; then
for exclude_dir in "${exclude_dirs[@]}"; do
find_command+=" -not -path \"*/$exclude_dir/*\""
done
fi
# Выполнение обхода и обработка файлов
eval "$find_command" | while read -r file; do
# Получаем относительный путь
relative_path="${file#$(readlink -f "$target_dir")/}"
# Проверяем, что файл читаем
if [[ -r "$file" ]]; then
# Записываем путь к файлу
echo "// $relative_path" >> "$temp_file"
# Записываем содержимое файла
cat "$file" >> "$temp_file"
# Добавляем разделитель между файлами
echo "" >> "$temp_file"
else
echo "Предупреждение: Невозможно прочитать файл $file" >&2
fi
done
# Перемещаем временный файл в окончательный
mv "$temp_file" "$output_file"
echo "Структура проекта сохранена в: $output_file"