Renomeie arquivos de música com extensões de arquivo ausentes

3

Eu tenho experimentado alguns músicos diferentes recentemente e percebi que parte da minha música estaria faltando na biblioteca. Acontece que, em algum momento, uma infinidade de meus arquivos de música perdeu suas extensões de arquivo .mp3 / .ogg / .flac. Eu honestamente não tenho certeza de como isso aconteceu, mas estou confiante de que foi algo que cometi por engano (ou talvez eu achei que não importaria, já que as extensões de arquivo são em sua maioria cosméticas).

Então, preciso recuperar essas extensões de arquivo. Eu olhei em pyrenamer, mas eu não consigo descobrir como combiná-lo com arquivos sem uma extensão e, em seguida, dizer-lhe para adicionar a extensão de arquivo correta dependendo do tipo real do arquivo. / p>

Eu também vi o EasyTag. No entanto, também reconhece arquivos de música baseados inteiramente em suas extensões de arquivo. Então a música que eu quero consertar nem aparece. Brilhante.

Alguma ideia de como fazer isso? Eu certamente não me importo com alguma linha de comando, eu não tenho certeza quais ferramentas seriam melhores e eu também sou péssima em regex.

    
por gregghz 15.10.2010 / 00:57

2 respostas

7

Aqui está um script bash que renomeia os arquivos passados para ele com base em seu formato adivinhado. Ele chama file para descobrir o formato observando padrões característicos em os primeiros bytes. file -i imprime linhas como /path/to/file: type/subtype , em que type/subtype é um tipo MIME . O script associa as extensões a tipos conhecidos e renomeia o arquivo para ter a extensão. Os arquivos que já possuem a extensão são deixados sozinhos. Arquivos que possuem um tipo não reconhecido são deixados sozinhos. O script perguntará antes de sobrescrever um arquivo de destino.

#!/bin/bash
# usage:
# fixmime ./{**/,}*
file --mime-type "$@" |
while read -r line; do
  file=${line%:*}
  type=${line##* }
  case $type in

    #Audio
    audio/x-flac) ext=flac;;
    audio/mpeg) ext=mp3;;
    application/ogg) ext=ogg;;

    #Video
    video/mp4) ext=mp4;;
    video/x-flv) ext=flv;;
    application/octet-stream) ext=webm;;
    application/x-shockwave-flash) ext=swf;;

    #Images
    image/png) ext=png;;
    image/jpeg) ext=jpg;;
    image/gif) ext=gif;;
    image/x-ico) ext=ico;;

    #Text
    text/plain) ext=md;; #markup your notes, even when they are plain
    text/html) ext=html;;
    text/x-pascal) ext=py;;
    text/x-c++) ext=js;; #conflicts with .cpp, so use prefered
    text/x-c) ext=scss;; #usualy it is .c
    text/x-shellscript) ext=sh;;
    application/pdf) ext=pdf;;

    #Fonts
    application/x-font-ttf) ext=ttf;;
    application/vnd.ms-opentype) ext=otf;;

    #Archive
    application/x-gzip) ext=tar.gz;;
    application/x-bzip2) ext=tar.bz;;

    *) continue;;
  esac
  [[ $file = *.$ext ]] || mv -i -- "$file" "$file.$ext"
done

Salve o script como ~/bin/rename-based-on-content-type (ou o que você quiser) e torne-o executável ( chmod +x ~/bin/rename-based-on-content-type ). Passe os nomes dos arquivos que você deseja renomear para o script na linha de comando. Se você tiver uma árvore de diretórios /path/to/music/directory que deseja percorrer recursivamente, chame o script como

~/bin/rename-based-on-content-type /path/to/music/directory/{**/,}*
    
por Gilles 15.10.2010 / 01:35
2

Este script bash poderia fazer o truque:

#! /bin/bash

find ~/Music -type f | (while read path; do
    case 'file -i "$path"' in
        *audio/mp3*|*audio/mpeg*) ext='.mp3' ;;
        *application/ogg*) ext='.ogg' ;;
        *flac*) ext='.flac' ;;
        *) continue;; # ignore unknown files
    esac

    newname="$(dirname "$path")/$(basename "$path" "$ext").$ext"
    if [ "$path" != "$newname" ]; then
        mv -v "$path" "$newname"
    fi
done)

O script usa file -i para ler o tipo MIME de um arquivo; eu não tenho Arquivos FLAC aqui, então você pode querer verificar qual o tipo MIME para O FLAC está executando file -i a_file.flac (e possivelmente ajustando a origem do script).

Você pode adicionar uma opção -i a mv se quiser ser perguntado confirmação antes de qualquer renomeação de arquivo.

Pode ser uma boa ideia substituir mv -v por echo mv -v e fazer uma teste executado antes tentar as renomeações reais - o echo mv será imprima os comandos mv que seriam executados pelo script.

    
por Riccardo Murri 15.10.2010 / 01:48