#!/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 "Готово."