avatar_razor1995

Automatyczna zmiana rozszerzeń plików na podstawie MIME w Linux

Zaczęty przez razor1995, 18 Maj 2025, 00:32:30

Poprzedni wątek - Następny wątek

0 użytkowników i 1 Gość przegląda ten wątek.

razor1995

W Linuxach często zdarza się, że przeglądarka bądź system błędnie zapisuje rozszerzenie pobranego/zapisanego pliku, przez co np. nie generują nam się miniatury plików.
Oczywiście można ręcznie sprawdzić typ MIME pliku i zmienić rozszerzenie, ale gdy mamy więcej tak rozjechanych plików - robi się to monotonne i żmudne.

Najpierw trochę teorii.
Jak sprawdzić typ MIME?
file --mime-type naszplik.heicPo wykryciu zmieniamy rozszerzenie na zgodne z typem MIME.

Można to jednak sprowadzić do uruchomienia prostego skryptu, który przeszuka katalog, w którym jest uruchomiony, wylistuje typy MIME i adekwatnie do nich zmieni nam rozszerzenia.
Najpierw tworzymy sobie plik skryptu, np. Nie masz uprawnień do wyświetlania linków. Zarejestruj się lub Zaloguj, o takiej treści:
#!/bin/bash

# Mapowanie MIME -> rozszerzenia
declare -A mime_map=(
  ["image/jpeg"]="jpg"
  ["image/png"]="png"
  ["image/heic"]="heic"
  ["image/heif"]="heif"
  ["video/mp4"]="mp4"
  ["video/x-matroska"]="mkv"
  ["video/MP2T"]="ts"
  ["audio/mpeg"]="mp3"
)

# Przetwarzaj pliki w bieżącym katalogu
for file in *; do
  # Pomijaj katalogi
  [ -f "$file" ] || continue

  # Wykryj MIME
  mime=$(file --mime-type -b "$file")

  # Znajdź właściwe rozszerzenie
  ext=${mime_map[$mime]}

  if [ -n "$ext" ]; then
    # Usuń stare rozszerzenie
    base="${file%.*}"

    # Jeśli rozszerzenie jest już poprawne, pomiń
    if [[ "$file" == *.$ext ]]; then
      continue
    fi

    # Zmień nazwę pliku
    newname="$base.$ext"
    echo "Renaming: $file → $newname"
    mv -n -- "$file" "$newname"
  else
    echo "❌ Unknown MIME type: $mime for file: $file"
  fi
done
Nadajemy oczywiście prawa do wykonywania:
chmod +x fix-extensions.shI uruchamiamy nasz skrypt w żądanym katalogu komendą:
./fix-extensions.sh
Laptop: Lenovo ThinkPad T480s | Intel Core i5 8250U | Intel HD 620 | 24GB RAM Hynix | Lexar NM620 NVME 1TB | Windows 10 Pro
Laptop testowy: Lenovo ThinkPad T430 | Intel Core i7 3740QM | Intel HD 4000 | 16GB RAM Hynix | Samsung 850 Pro 256GB | Windows 7 Pro | Windows XP Pro x64
PC: MSI Z87-G43 | Intel Xeon E3-1240 v3 | nVidia RTX 3060Ti 8GB | 32GB RAM Hynix | GoodRAM PX 500 NVME 512GB | Windows 10 Pro
Mobile: Google Pixel 6 | Google Tensor GS101 @2.8 GHz | Mali-G78 MP20 | 8GB RAM | 128GB MMC | Android 15
Sieć: Cudy WR3000 AX OpenWRT | Huawei HG8010H | Netia 1Gb/s
PlayStation 4 | CUH-1116A | 1TB SSD|