重命名缺少文件扩展名的音乐文件

gre*_*ghz 3 filesystem music

我最近一直在尝试一些不同的音乐播放器,并注意到我的一些(很多)音乐会从库中丢失。事实证明,在某些时候,我的大量音乐文件丢失了它们的 .mp3/.ogg/.flac 文件扩展名。老实说,我不确定这是怎么发生的,但我相信这是我做错的事情(或者我认为这无关紧要,因为无论如何文件扩展名大多是装饰性的)。

所以我需要取回这些文件扩展名。我已经研究过pyrenamer,但我无法弄清楚如何将它与没有扩展名的文件匹配,然后告诉它根据文件的实际类型添加正确的文件扩展名。

我也看过EasyTag。但是,它也可以完全根据文件扩展名识别音乐文件。所以我想修复的音乐甚至没有出现。杰出的。

关于如何做到这一点的任何想法?我当然不介意一些命令行,我只是不确定哪种工具是最好的,而且我也很擅长正则表达式。

Gil*_*il' 7

这是一个 bash 脚本,它根据猜测的格式重命名传递给它的文件。它要求file通过查看前几个字节中的特征模式来确定格式。file -i打印诸如/path/to/file: type/subtypewhere type/subtypeis a MIME type 之类的行。然后脚本将扩展名与已知类型相关联,并将文件重命名为具有扩展名。已经具有扩展名的文件被保留。具有无法识别类型的文件被保留。脚本将在覆盖目标文件之前提示。

#!/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
Run Code Online (Sandbox Code Playgroud)

将脚本另存为~/bin/rename-based-on-content-type(或任何您喜欢的)并使其可执行 ( chmod +x ~/bin/rename-based-on-content-type)。在命令行上将要重命名的文件的名称传递给脚本。如果您有/path/to/music/directory要递归遍历的目录树,请按以下方式调用脚本

~/bin/rename-based-on-content-type /path/to/music/directory/{**/,}*
Run Code Online (Sandbox Code Playgroud)