Created
October 16, 2025 13:47
-
-
Save ponfertato/594a276a4ff17b3518847d39b706dbb0 to your computer and use it in GitHub Desktop.
Скрипт для сбора содержимого файлов с определёнными расширениями из выбранной директории
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/bash | |
| show_help() { | |
| cat << EOF | |
| Описание: | |
| Скрипт для сбора содержимого файлов с определёнными расширениями из выбранной директории. | |
| Выводит список всех файлов и содержимое только файлов с указанными расширениями в один текстовый файл. | |
| Скрытыe файлы и файлы в скрытых папках игнорируются. | |
| Использование: | |
| $0 [ОПЦИИ] | |
| Опции: | |
| -d, --directory PATH Директория для поиска. Если не указана, будет предложено выбрать или ввести. | |
| -o, --output FILE Выходной файл. По умолчанию 'extracted-code.txt'. | |
| -x, --extensions LIST Список расширений через запятую для обработки (например, ts,js,json). По умолчанию: ts,js,json,css,scss,html,xml,sql,md,yml,yaml,toml,ini,cfg,txt,sh,bash,py,java,go,rs,tsx,jsx,sql,log,env | |
| -h, --help Показать справку. | |
| EOF | |
| } | |
| DEFAULT_CODE_EXTENSIONS="ts,js,json,css,scss,html,xml,sql,md,yml,yaml,toml,ini,cfg,txt,sh,bash,py,java,go,rs,tsx,jsx,sql,log,env" | |
| directory_path="" | |
| output_file="extracted-code.txt" | |
| code_extensions="$DEFAULT_CODE_EXTENSIONS" | |
| while [[ $# -gt 0 ]]; do | |
| case $1 in | |
| -d|--directory) | |
| directory_path="$2" | |
| shift 2 | |
| ;; | |
| -o|--output) | |
| output_file="$2" | |
| shift 2 | |
| ;; | |
| -x|--extensions) | |
| code_extensions="$2" | |
| shift 2 | |
| ;; | |
| -h|--help) | |
| show_help | |
| exit 0 | |
| ;; | |
| -*) | |
| echo "Ошибка: Неизвестная опция: $1" >&2 | |
| show_help | |
| exit 1 | |
| ;; | |
| *) | |
| echo "Ошибка: Неизвестный аргумент: $1" >&2 | |
| show_help | |
| exit 1 | |
| ;; | |
| esac | |
| done | |
| if [[ -z "$directory_path" ]]; then | |
| echo "Выберите директорию для обработки." | |
| echo "Доступные папки в текущей директории (не включая скрытые):" | |
| shopt -s nullglob dotglob | |
| dirs=(*/) | |
| shopt -u dotglob | |
| if [[ ${#dirs[@]} -eq 0 ]]; then | |
| echo " (В текущей директории нет видимых папок)" | |
| selected_dir="" | |
| else | |
| select dir in "${dirs[@]}" "Другой путь..."; do | |
| case "$dir" in | |
| "Другой путь...") | |
| echo -n "Введите путь к директории: " | |
| read -r input_path | |
| directory_path="$input_path" | |
| break | |
| ;; | |
| "") | |
| echo "Неверный выбор. Попробуйте снова." >&2 | |
| ;; | |
| *) | |
| directory_path="$(pwd)/$dir" | |
| break | |
| ;; | |
| esac | |
| done | |
| fi | |
| fi | |
| if [[ ! -d "$directory_path" ]]; then | |
| echo "Ошибка: Директория '$directory_path' не существует." >&2 | |
| exit 1 | |
| fi | |
| directory_path=$(realpath "$directory_path") | |
| escaped_directory_path=$(printf '%s\n' "$directory_path" | sed 's/[[\.*^$()+?{|]/\\&/g') | |
| if [[ "$output_file" != /* ]]; then | |
| output_file="$(pwd)/$output_file" | |
| fi | |
| IFS=',' read -ra ext_array <<< "$code_extensions" | |
| declare -A allowed_extensions | |
| for ext in "${ext_array[@]}"; do | |
| clean_ext=$(printf '%s\n' "$ext" | tr -d ' ' | tr '[:upper:]' '[:lower:]') | |
| allowed_extensions["$clean_ext"]=1 | |
| done | |
| echo "Обработка файлов в: $directory_path" | |
| echo "Расширения для содержимого: $code_extensions" | |
| echo "Выходной файл: $output_file" | |
| echo "" | |
| > "$output_file" | |
| find "$directory_path" -type f -not -path '*/\.*/*' -not -name '.*' | \ | |
| while read -r file_path; do | |
| relative_path=$(printf '%s\n' "$file_path" | sed "s|^$escaped_directory_path/||") | |
| echo "[ $relative_path ]" >> "$output_file" | |
| filename=$(basename "$file_path") | |
| extension="${filename##*.}" | |
| if [[ "$filename" == "$extension" ]]; then | |
| extension="" | |
| else | |
| extension=$(printf '%s\n' "$extension" | tr '[:upper:]' '[:lower:]') | |
| fi | |
| if [[ -n "${allowed_extensions[$extension]}" ]]; then | |
| { | |
| cat "$file_path" | |
| echo "" | |
| } >> "$output_file" | |
| fi | |
| done | |
| echo "Сбор списка файлов и содержимого кода завершён." |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment