Skip to content

Instantly share code, notes, and snippets.

@ponfertato
Created October 16, 2025 13:47
Show Gist options
  • Select an option

  • Save ponfertato/594a276a4ff17b3518847d39b706dbb0 to your computer and use it in GitHub Desktop.

Select an option

Save ponfertato/594a276a4ff17b3518847d39b706dbb0 to your computer and use it in GitHub Desktop.
Скрипт для сбора содержимого файлов с определёнными расширениями из выбранной директории
#!/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