¿Cómo cambiar el nombre de archivos con nombres incorrectos con sus extensiones apropiadas?

¿Cómo cambiar el nombre de archivos con nombres incorrectos con sus extensiones apropiadas?

Tengo una carpeta con la mayor parte de archivos de diferentes tipos, es decir.pdf,.jpg,.png,.peleaetc., pero todos tienen el nombre de la extensión.JPG. ¿Cómo puedo cambiarles el nombre a todos con sus extensiones originales? es decirpdfapdf,peleaapeleaetcétera.

Puedo encontrar el tipo de archivo por:

file 99.jpg
99.jpg: PDF document, version 1.3

¿Existe algún script o programa con el que pueda hacer esto?

Respuesta1

Puede utilizar el tipo MIME encontrado por file:

#! /usr/bin/env bash
for f in ./*.JPG; do
    type=$(file -bi "$f")
    type=${type%%;*}
    base=${f%.*}
    final=
    case "$type" in
        application/pdf) final="$base".pdf ;;
        image/png)       final="$base".png ;;
        image/tiff)      final="$base".tiff ;;
    esac
    if [ "$final" ]; then
        printf '%s --> %s\n' "$f" "$final"
        # mv -f "$f" "$final"
    fi
done

Agregue más tipos a casesi es necesario (pero omita image/jpeg, ya que los archivos JPEG ya tienen la extensión correcta). Revise los cambios y luego descomente la mvlínea cuando esté satisfecho con los resultados.

Respuesta2

  1. Generar los comandossinejecutándolos.

    Úselo mimetypepara generar una lista de cadenas de comandos, que posteriormente se modifica medianteÑU sed'ssustituto sdominio:

    cd ~/messed/up/folder/  # go where the files are...
    mimetype -M --output-format 'mv "%f" "%f%m"' *.JPG |
       sed 's#\.[^./"]*/\([^./]*"\)$#\.\1#'
    
  2. Si algunas de las extensiones de archivos se ven demasiadomímica-ish, (es decir, .jpegen lugar de .jpg, etc.), luego agregue tantos scomandos como sea necesario entre sed 'y s, por ejemplo:

    sed 's/jpeg"$/jpg"/;s#\.[^./"]*/\([^./]*"\)$#\.\1#'
    
  3. Una vez que el resultado se vea bien, ejecútelo con elÑU sed's evaluar eopción. (Simplemente coloque un eantes del final '). Entonces todo podría verse así:

    cd ~/messed/up/folder/  # go where the files are...
    mimetype -M --output-format 'mv "%f" "%f%m"' *.JPG |
        sed 's/jpeg"$/jpg"/;s#\.[^./"]*/\([^./]*"\)$#\.\1#e'
    ls  # show results
    

información relacionada