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/{**/,}*