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


#!/bin/bash

# === Настройки ===
TARGET_DIR="${1:-.}"                     # Папка для обработки (по умолчанию текущая)
DRY_RUN=false                            # true = только показать, что будет сделано
FORCE_ALL=true                           # 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")

    # Определяем базовое имя (без расширения)
    if [[ "$filename" == *.* ]]; then
        base="${filename%.*}"
    else
        base="$filename"
    fi

    # Если включена замена пробелов
    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 "Готово."