Загрузка данных


#!/bin/bash

# === Настройки ===
TARGET_DIR="${1:-.}"                     # Папка для обработки (по умолчанию текущая)
DRY_RUN=false                            # true = только показать, что будет сделано
REPLACE_SPACES=false                     # true = заменить пробелы на '_' в именах

# === Таблица соответствия MIME‑тип → расширение ===
declare -A MIME_TO_EXT=(
    ["application/pdf"]="pdf"
    ["application/vnd.openxmlformats-officedocument.wordprocessingml.document"]="docx"
    ["application/msword"]="doc"
    ["application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"]="xlsx"
    ["application/vnd.ms-excel"]="xls"
    ["application/vnd.openxmlformats-officedocument.presentationml.presentation"]="pptx"
    ["application/vnd.ms-powerpoint"]="ppt"
    ["application/zip"]="zip"
    ["application/x-tar"]="tar"
    ["application/gzip"]="gz"
    ["application/x-bzip2"]="bz2"
    ["application/x-xz"]="xz"
    ["image/jpeg"]="jpg"
    ["image/png"]="png"
    ["image/gif"]="gif"
    ["image/svg+xml"]="svg"
    ["text/plain"]="txt"
    ["text/html"]="html"
    ["text/x-shellscript"]="sh"
    ["inode/x-empty"]=""                 # пустые файлы не трогаем
)

# === Функция безопасного переименования ===
rename_file() {
    local oldpath="$1"
    local newpath="$2"

    if [[ "$oldpath" == "$newpath" ]]; then
        return
    fi

    if [[ "$DRY_RUN" == true ]]; then
        echo "[DRY RUN] mv '$oldpath' '$newpath'"
    else
        mv -n "$oldpath" "$newpath" && echo "✓ $oldpath -> $newpath"
    fi
}

# === Основной цикл ===
export DRY_RUN REPLACE_SPACES
export -f rename_file
export MIME_TO_EXT

find "$TARGET_DIR" -type f -print0 | while IFS= read -r -d '' filepath; do
    filename=$(basename -- "$filepath")
    dirname=$(dirname -- "$filepath")

    # Проверяем, есть ли у файла расширение (точка не в начале имени)
    # Скрытые файлы без расширения (например, ".hidden") тоже считаем без расширения
    if [[ "$filename" == *.* && "$filename" != .* ]]; then
        # Есть точка и это не скрытый файл вида ".имя" → расширение уже есть, пропускаем
        continue
    fi

    # Определяем базовое имя (всё имя файла, так как расширения нет)
    base="$filename"

    # Замена пробелов (опционально)
    if [[ "$REPLACE_SPACES" == true ]]; then
        base="${base// /_}"
    fi

    # Получаем MIME‑тип
    mime=$(file --mime-type -b "$filepath" 2>/dev/null)
    if [[ -z "$mime" ]]; then
        echo "⚠ Не удалось определить MIME-тип: $filepath" >&2
        continue
    fi

    # Ищем расширение по таблице
    new_ext="${MIME_TO_EXT[$mime]}"
    if [[ -z "$new_ext" ]]; then
        # Тип не найден — пропускаем (можно раскомментировать для отладки)
        # echo "⚠ Неизвестный MIME-тип $mime для $filepath" >&2
        continue
    fi

    # Собираем новое имя
    new_filename="${base}.${new_ext}"
    new_filepath="${dirname}/${new_filename}"

    rename_file "$filepath" "$new_filepath"
done

echo "Готово."