![使用正则表达式在批量文件重命名器中更改(重新组织)多个文件名](https://linux22.com/image/1437619/%E4%BD%BF%E7%94%A8%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%9C%A8%E6%89%B9%E9%87%8F%E6%96%87%E4%BB%B6%E9%87%8D%E5%91%BD%E5%90%8D%E5%99%A8%E4%B8%AD%E6%9B%B4%E6%94%B9%EF%BC%88%E9%87%8D%E6%96%B0%E7%BB%84%E7%BB%87%EF%BC%89%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6%E5%90%8D.png)
我有几千个 MP3 文件嵌套在文件夹中,我想批量重命名它们。
这些文件当前具有以下命名约定:
"tracknumber_artistname_-_songname_MP3COLLECTION.mp3"
例如:
"01_Michael_Jackson_-_Wanna_Be_Startin'_Something_MP3COLLECTION.mp3"
但是,我想通过将艺术家姓名移到歌曲名称后面、删除末尾的多余内容以及将所有下划线替换为空格来重新组织这些文件,从而得到上述约定和示例,如下所示:
"tracknumber songname - artistname.mp3"
"01 Wanna Be Startin' Something - Michael Jackson.mp3"
我有批量文件重命名器,它提供了正则表达式选项,但我不知道该怎么做。有什么建议吗?如果批量文件重命名不是最佳选择,我也愿意使用其他工具甚至方法。
注:我最初在 StackExchange 上发布了此内容,但由于与那边的主题无关,我被建议将其发布在这里。
答案1
在 Windows 中?我不知道“批量文件重命名器”。我会使用 Total Commander 的“多重重命名”工具。更好的是,我可能会在 Cygwin 终端上使用 perl 或 awk 来获得更全面的脚本解决方案。不过,这太过分了。仅从正则表达式的角度来看,这在 TC 中对我的文件名有效(但前提是文件在艺术家或歌曲标题字段中不包含额外的“-”或“。”),应该可以在任何支持正则表达式的批量重命名工具中使用,而不会有太多麻烦,因为我认为我没有使用任何花哨的高级正则表达式,如 posix 字符类(“:digit:”等)...
如果您使用的是 TC,则需要在“多重重命名”工具的“搜索和替换”部分中勾选“[E]”和“RegEx”复选框,并取消勾选其他三个复选框。我自己在 TC 中测试了整个过程,所以请您理解我为您花费的时间 :) 如果您使用其他工具并且它不起作用,请在其与 RegEx 相关的帮助中搜索“反向引用”,因为某些工具倾向于使用不同的 RegEx 反向引用标准。(下面我的代码中的 $1 $2 $3 等在搜索中引用了括号中的某些内容。)
笔记如果你要批量重命名,看在上帝的份上,请先备份你的整个收藏。你永远不知道。我不负责,等等。
第一的:将 {tracknr}_{artist} 中的分隔符改为“_-_”,而不是当前的“_”。因为“_-_”似乎是一个有用的分隔符,它通常不会意外出现在任何普通文本中。另外,让我们在这里删除“_{MP3COLLECTION}”部分。
search for: (([0-9]+)_)(.*)_(.*)(\..*)
replace with: $2_-_$3$5
笔记:这假设您在重命名过程中包括了文件扩展名,并确保保留该扩展名,以防您还有 .ogg 文件或其他文件。如果您的工具在重命名过程中不包括扩展名,请从搜索中删除最后一个“(\..*)”,并从替换中删除最后一个 $5。
您的名字现在看起来像:1_-_Michael_Jackson_-_Wanna_Be_Startin'_Something.mp3
第二:现在将第一次出现的“_._”替换为“ ”,将第二次出现的“_._”替换为“ - ”:
search for: (.*?)_-_(.*?)_-_(.*)(\..*)
replace with: $1 $2 - $3$4
笔记:再次,如果您的工具在处理过程中未包括文件扩展名,请从搜索中删除最后一个“(\..*)”并从替换中删除最后一个 $4。
你的名字现在看起来像:1 Michael_Jackson - Wanna_Be_Startin'_Something.mp3
第三点也是最后一点:只需将“_”替换为“ ”即可。
你的名字现在看起来像:1 Michael Jackson - Wanna Be Startin' Something.mp3
祝你好运!
/编辑:需要相当高的精度才能确保所有这些下划线都正确显示在这篇文章中:)
/编辑 2:事后想法。您可能还想用 0 填充 10 以下的曲目编号(即 0-9),这样您就会得到 01、02、...、09、10、11 等。这使得排序变得更加容易,并且大大增加了手机或 MP3 播放器等设备按正确顺序播放曲目的机会。为此:
Search for: (^[0-9] )
Replace with: 0$1
答案2
我的第一反应是不要尝试编写程序或脚本来执行此操作,而是使用现成的 mp3 重命名程序为您执行此操作。不同的操作系统有不同的程序可用(质量各异)。
或者,如果您热衷于重命名的想法,您可以使用 gnu 工具(可在 linux/unix/mac 或 Cygwin 中使用),例如bash 脚本中的sed
或awk
,或tr
& cut
& 变量……您需要一种标准的方法来分离文件名中的字段(歌曲、艺术家、曲目),如果您在它们之间使用可变数量的空格,并且没有设置字段分隔符,那将会很棘手。
这是一个非常非常快速的初步awk
行,它分隔传入的字符串(之后_
已被转换为空格)并以不同的顺序打印出来,您必须自己弄清楚如何在开始时保留“tracknumber”:
$ jackstring="tracknumber_artistname-songname_MP3COLLECTION.mp3"
$ echo $jackstring
tracknumber_artistname-songname_MP3COLLECTION.mp3
$ echo "$jackstring"|tr -s "_" " "|awk -F'[-.]' '{printf "%s-%s.%s\n", $2,$1,$3 }'
songname MP3COLLECTION-tracknumber artistname.mp3