如何编写批量重命名音乐标题脚本

wen 实用脚本 2

从零开始的自定义音频管理指南

📖 目录导读

  1. 为什么需要批量重命名音乐标题脚本?
  2. 准备工作:了解音乐文件元数据与文件名结构
  3. 核心方法:三种主流脚本方案详解
    • 1 Python脚本(基于mutagen库)
    • 2 PowerShell脚本(Windows原生)
    • 3 Bash脚本(Linux/macOS)
  4. 实战案例:从混乱文件名到规范标签的完整流程
  5. 常见错误与调试技巧
  6. 问答环节:解决你最常见的6个疑问
  7. 进阶建议:集成到自动化工作流

为什么需要批量重命名音乐标题脚本?

你是否曾面对数百首下载的音乐,文件名混乱不堪?song_123.mp3Unknown Artist - Track 1.mp3!@#audio2023.mp3,手动重命名不仅耗时,且容易出错,批量重命名脚本能自动提取音乐文件的元数据(ID3标签)、艺术家、专辑),并按照你设定的规则(如 艺术家 - 标题.mp3)统一重新命名,根据权威网站 AudioShell 的统计,使用脚本可节省90%以上的手动操作时间,同时避免因误操作导致的文件丢失。

如何编写批量重命名音乐标题脚本


准备工作:了解音乐文件元数据与文件名结构

在编写脚本前,需理解两个关键概念:

  • 文件名:操作系统看到的文本字符串,如 01 - 晴天.mp3
  • 元数据标签:存储在文件内部的属性,如ID3v2标签(包含标题、艺术家、专辑、年份等),脚本通常通过读取标签来生成新文件名。

常见工具:mutagen(Python库)、ffprobe(FFmpeg套件)、MediaInfo(跨平台),建议使用ID3v2.4版本,兼容性最佳。


核心方法:三种主流脚本方案详解

1 Python脚本(最灵活,跨平台)

import os
import mutagen
def rename_music_files(directory):
    for file in os.listdir(directory):
        if file.endswith(('.mp3', '.flac', '.m4a')):
            try:
                audio = mutagen.File(os.path.join(directory, file))
                title = audio.get('title', ['Unknown'])[0]
                artist = audio.get('artist', ['Unknown'])[0]
                new_name = f"{artist} - {title}{os.path.splitext(file)[1]}"
                # 清理非法字符
                safe_name = "".join(c for c in new_name if c.isalnum() or c in " .-_()")
                os.rename(os.path.join(directory, file), os.path.join(directory, safe_name))
                print(f"Renamed: {file} -> {safe_name}")
            except Exception as e:
                print(f"Error with {file}: {e}")
if __name__ == "__main__":
    rename_music_files("/path/to/your/music")

优点:可处理多种格式,可自定义规则(如去除特殊字符、统一大小写)。
注意:需安装 mutagenpip install mutagen)。

2 PowerShell脚本(Windows用户友好)

$folder = "C:\Music"
Get-ChildItem $folder -Include *.mp3,*.flac -Recurse | ForEach-Object {
    $shell = New-Object -ComObject Shell.Application
    $folderObj = $shell.Namespace($_.DirectoryName)
    $fileObj = $folderObj.ParseName($_.Name)
    $title = $folderObj.GetDetailsOf($fileObj, 21)  # 21是歌曲标题的列索引
    $artist = $folderObj.GetDetailsOf($fileObj, 2)  # 2是艺术家
    if ($title -and $artist) {
        $newName = "$artist - $title$($_.Extension)"
        Rename-Item $_.FullName -NewName $newName -ErrorAction SilentlyContinue
        Write-Host "Renamed: $($_.Name) -> $newName"
    }
}

优点:无需额外安装,利用Windows资源管理器的属性系统。
缺点:依赖COM组件,速度较慢,仅限Windows。

3 Bash脚本(Linux/macOS)

#!/bin/bash
# 依赖:mediainfo (brew install mediainfo)
for f in *.mp3; do$(mediainfo --Inform="General;%Title%" "$f")
    artist=$(mediainfo --Inform="General;%Performer%" "$f")
    if [ -n "$title" ] && [ -n "$artist" ]; then
        newname="$artist - $title.mp3"
        mv "$f" "$newname"
        echo "Renamed: $f -> $newname"
    else
        echo "Skipping $f: missing metadata"
    fi
done

实战案例:从混乱文件名到规范标签的完整流程

场景:你下载了100首歌曲,文件名形如 123_audio.mp3,但ID3标签完整包含 周杰伦晴天
步骤

  1. 备份所有文件(建议先复制到测试文件夹)。
  2. 运行Python脚本,定义新格式为 {艺术家} - {标题}.mp3
  3. 脚本输出 周杰伦 - 晴天.mp3
  4. 检查是否有文件未处理(如缺少元数据,则保持原文件名并记录日志)。
  5. 二次运行脚本清理空格或中英文括号统一(例如将中文全角括号转为半角)。

预期结果:所有文件名规范统一,便于搜索与同步到设备(如手机、车载播放器)。


常见错误与调试技巧

  • 错误1:文件名包含非法字符(如 、、)
    解决:在生成新文件名时,用正则替换 [<>:"/\\|?*] 为空。
  • 错误2:同名冲突(例如两首不同歌曲但标题相同)
    解决:添加专辑名或编号,{艺术家} - {标题} ({年份}).mp3
  • 错误3:脚本无法读取中文元数据
    解决:确保Python文件编码为UTF-8;PowerShell需设置 $OutputEncoding = [Console]::OutputEncoding = [Text.UTF8Encoding]::UTF8
  • 错误4:多标签文件导致“None”值
    解决:使用 audio.get('title', ['Unknown'])[0] 提供默认值。

问答环节:解决你最常见的6个疑问

Q1:我需要安装什么才能运行脚本?
A:Python方法需安装Python 3.6+及mutagen库;PowerShell方法适用于Windows 10/11;Bash方法需macOS或Linux,并预装mediainfoffprobe

Q2:脚本能处理FLAC或AAC格式吗?
A:可以。mutagen支持MP3、FLAC、OGG、MP4(M4A)等主流格式,PowerShell方法限MP3和WMA;Bash方法需调整参数。

Q3:如何只重命名特定的子文件夹?
A:Python脚本可加入os.walk遍历子目录;PowerShell加-Recurse参数;Bash用find . -name "*.mp3"

Q4:重命名后还能恢复原始文件名吗?
A:建议在运行脚本前用copy -Recurse备份文件夹,或编写回滚脚本,保存旧名称与新名称的映射关系CSV。

Q5:如何用脚本从文件名中提取信息来更新元数据?
A:可用正则解析文件名(如^(.*?) - (.*?)\.mp3$)提取艺术家和标题,再写入ID3标签。mutagen[‘TPE1’][‘TIT2’]字段可写。

Q6:能否用脚本删除文件名中的序号,只保留标题?
A:可以,使用正则^[\d\s\-_]+匹配并移除前缀,但需确保标题本身不包含序号。


进阶建议:集成到自动化工作流

  • 定时任务:设置cron job(macOS/Linux)或任务计划程序(Windows),每天扫描你的音乐文件夹。
  • 结合Docker:将Python脚本封装成容器,避免环境依赖问题。
  • GUI增强:使用tkinterPyQt开发简易界面,允许用户选择文件夹和命名模板(如{专辑}/{曲目号} - {标题}.mp3)。
  • 云同步:脚本运行后,自动触发rsync或rclone将重命名后的文件同步到NAS或云存储。

推荐工具beets(专业音乐管理工具,内置标签清洗与重命名功能)、MusicBrainz Picard(图形化元数据编辑)。

抱歉,评论功能暂时关闭!