【267】45周 文件批量重命名终极解决方案

Minja
07月10日

文件批量重命名终极解决方案

| 本文为付费栏目文章,您已订阅,可阅读全文 |
最近考试结束,不少人开始补追美剧、追日漫,我就有一个朋友,他下载了落下的几十集电视剧,但由于字幕文件是从各个不同的字幕组获取的,文件命名格式非常混乱,他就想把它们都改成自己喜欢的格式。但是一个一个重命名,让他觉得非常愚蠢。

左/下载的字幕文件名 右/理想的的文件名-fs8
于是我做了一个 Automator 小工具,帮他解决文件批量重命名的需求
正则重命名
这件事让我意识到,重命名一个文件谁都会,但是当文件数量多起来、命名格式复杂起来,手动命名就不是什么好主意,毕竟,现在电脑下围棋都比人类厉害了,我们凭啥还要做逐个重命名这种原始的劳动?
所以在这篇文章中,我将从最简单的图形化工具开始,进阶到自动化工具,最后是高度自定义的正则表达式,力求为你找到最全面的文件批量重命名思路及解决方案。

基础技巧:Finder 自带的图形化重命名功能

在求助专门的重命名工具之前,我们不妨先来看看 Finder 自带的批量重命名功能。至于它有哪些不能满足的场景,后面的小节中再解决也不迟。
对于 Finder 中的文件,你可以批量选中之后点击右键,选择「给 n 个项目重命名(n 的具体数值取决于你选中的文件数量)」。

批量重命名
Finder 提供了 3 种重命名模式,我平时都经常会用到:
  1. 替换文本(Replace Text):替换原文件名中的关键词,比如把书籍作者的中译名换回外文原名,还可以把某某字幕组制作换成空文本来批量移除部分文本;
    替换文本
  2. 添加文本(Add Text):给原文件名添加前缀或后缀,我习惯在 Sketch 文件前面加上 Logo-题图海报 这样的前缀,这样按照文件名排序后可以更快地找到文件;
    添加文本
  3. 格式(Format)自定义样式,包括给文件名编号和添加日期,我常常用来给 PPT 标日期、给插画集里面的图片打编号。
    格式

    分享一个编号的小技巧,批量重命名时,你可能发现文件编号是随机的,其实你可以按住 ⌘Command 键再一个一个点选,或者按住光标再拉出选区扫过文件,就能按照自定义的顺序来给文件编号。
    按顺序编号
其实,这些作为系统系原生功能出现的重命名模式,基本也是我们最常用到的功能。不过,在使用过程中,你可能遇到一些 Finder 无法满足的场景,比如改变文件名的大写小、更改文件拓展名、添加 2018-07-10 这类更简明的日期后缀,等等。这些需求,可以用重命名功能更加丰富的 Automator 来实现。

进阶技巧:用 Automator 打造重命名工作流

Automator 在提供了更加丰富的配置选项的同时,保留了和 Finder 类似的图形化界面,仍然很容易上手。总的来说,对比 Finder,Automator 有以下的几大优点:
  1. 更丰富的日期选项:可以自定义日期格式,标出 2018-07-10 这种更常见的日期格式;还可以自动标上文件修改、创建的时间,方便查看文件的版本;
    日期和时间
  2. 更细致的文件编号:可以设置数字编号的位数,方便播放器正确识别(1 位数字的编号会被认错);
    连续编号
  3. 支持改变文件名大小写:可以让文件名中的英文全小写、全大写或者仅首字母大写,我总是用它来命名英文歌曲;
    大写小
  4. 支持修改文件拓展名:用 Automator 来改拓展名可以跳过系统警告,用起来更加清爽;
    更改文件名或拓展名
  5. . 支持多步骤:可以把多个重命名步骤连接起来,我从 pixiv 下载插画时常常要用 插画集名称-编号 的格式来重命名,就需要串联「改变大小写」和「连续编号」两个动作。
    多步骤
  6. . 支持自动化:可以把一系列重命名操作打包成自动化工作流,不需要每次要用时重做一次,比如可以自制一个 Automator App,把文件拖到上面就能实现重命名。
    打包重命名操作
下面,就让我们看看各个特色功能具体都有哪些使用场景。

更丰富的日期选项

虽然 Finder 也有添加日期后缀的功能,但它的格式实在让中文用户难以适应——2018 at 09/17/40 AM,你一眼看得出来这是什么日期和时间吗?我们更习惯的,是 2018-07-042018/07/04 这类简明的年月日表示方式。而 Automator 则可以自己指定年月日的顺序,打造出你需要的样式。

更易读的日期格式
另一方面,Automator 允许我们根据按照文件创建、修改或者当前的日期和时间来重命名。

不同依据的日期
这在整理照片、给文件标注版本时很好用,比如设计师朋友给多个版本的设计稿命名时,就用不着 第一版最终版最终版 V2.0 这样模棱的命名,直接用 Automator 的「修改」选项就可以根据文件修改的精确时间点来命名。

用日期区分文件版本

更细致的文件编号

说到给文件编号,我们习惯上觉得 123……这样的编号就行了,其实这种格式是有问题的,会导致一些应用没法正确识别文件的顺序。比如,许多播放器(包括热门的 IINA)默认只会傻傻按照 1,10,11,12……2,20,21,22…… 的顺序来播放视频,这无疑会硬生生打乱观影和学习的节奏。
Automator 的「连续编号」功能可以让我们调整编号数字的长度,能够标出 01,02,03 格式的两位数字编号,可以避免应用认错编号。对于经常下载剧集和公开课的读者来说,用 Automator 来重命名这些视频文件比用 Finder 更好。

两位数的编号不容易被误读

改变大小写

虽说我们接触最多的文件可能还是中文名的,但是改变英文文件名大写小的需求也不算罕见。比如你下载了一堆文件名通通是小写字母的音乐,特别是第一人称 I 总写成 i,你看着难受不难受?我想更多读者还是更喜欢首字母大写的命名方式,这时候 Automator 就派上用场了。

首字母大写

能改文件名,也能改拓展名

有时我们会下载到故意采用错误拓展名的文件,或者需要把一堆 txt 文档转成 markdown 文件,此时你每改一次拓展名系统就警告你一次,很闹心。

系统警告
用 Automator 来修复或转换拓展名就很干脆了,全程一个警告也没有:

没有警告
你想,要改 10 个文件,就得傻乎乎和系统说 10 次「我同意」,再有耐性的人也不会喜欢这种操作吧。

串联多个重命名步骤

上面提到的几个特点都是关于单个动作的,其实,Automator 还可以串联多个动作,一次性执行多个重命名操作。但说实话,我自己只会把改变大小写的步骤串联到其他动作后面,所以下面的例子会有点单薄,只是在添加文本后再把单词首字母大写,如果读者们发现串联动作有其他的使用场景,欢迎告诉我。

串联动作

把常用的重命名操作打包成工作流

Automator 最后一个优势就是可以把重命名操作打包成为一个独立 App,这样一来,常用的操作就不用每次重新折腾一遍了,不然不是平添麻烦嘛。我就把首字母大写的操作打包了起来,省得每次新建一个工作流。

打包
不过,用过 Finder 的重命名功能的人都知道,Finder 会提供一个输入窗口,方便我们直接输入要替换或者添加的文本,而 Automator App 运行起来似乎跟一个黑箱一样,怎样在每次使用的时候能够临时输入需要的文本呢?使用变量就可以了。
下面就是一组添加文本的 Automator 步骤,其中多次设定和获取了变量,具体步骤的作用是:
  1. 将待重命名的文件设为变量「输入的文件」;
  2. 等待用户输入文件前缀;
  3. 将用户输入的文本设为变量「文件前缀」;
  4. 获取变量「输入的文件」,传给下一步;
  5. 进行添加文本的重命名操作;
  6. 将文件名中的单词首字母大写。

多步骤
它运行起来是这样的:
打包

高级技巧:用正则表达式满足个性化需求

关于批量重命名,在我看来最麻烦的就是电影、美剧、动漫文件的整理。下面就是一个典型的命名杂乱的字幕文件,版本、剧名、剧集编号、清晰度、字幕组名等等都堆在文件名里面。

字幕文件名
但我们真正需要的,一般只是剧名和剧集编号,理想的文件命名格式应该像 西部世界 S01E02 这样精简整齐。
就拿美剧字幕来说,我们需要从原文件名中提取出符合 S01E02 这样格式的文本,再组合出新的文件名。这时候 Finder 和 Automator 都不能直接派上用场,我们就需要使用正则表达式了
正则表达式是一种通用表达式,可以用一些特殊字符表示一组符号,比如用 \w 表示任何一个英文字母。下面的例子里,我们用到的正则表达式是 S\d\dE\d\d,其中 \d 表示任何一位数字,整串表达式表示的就是 S数字数字E数字数字 格式的剧集编号。
要用正则表达式的话,先介绍一个现成的批量重命名工具:A Better Finder Rename 10。你可以直接使用「Advanced & Special - Replace regular expression」,填入 Pattern(需匹配的样式)(.*)(S\d\dE\d\d)(.*) 和需要换上的文本(With)西部世界-$2 。右边就是替换后的文件名预览:

A Better Finder Rename 10 界面
A Better Finder Rename 10 非常好用,除了正则重命名,Automator 的全部功能它也能做到,但是它在 Mac App Store 要卖一百多块钱,要是你不想画这笔钱,我也为你准备了一个 Automator,只是它里面涉及比较多的脚本知识,原理稍后会说,当然你只看使用说明也能正常使用。
正则重命名
运行这个 Automator 期间会弹出两次输入框,第一次是让你输入正则表达式,默认是 S\d\dE\d\d。你可以在弹出的输入框里把 S\d\dE\d\d 改成别正则表达式,来满足不同场景的需求。第二次则是让你添加剧名作为前缀。
这个 Automator 的步骤只有一步,运行了一段 shell 脚本,所以你也可以稍作修改用到其他的自动化工具中,比如 Keyboard MaestroLaunchBar

Automator 中的 shell 脚本
各个部分的作用是:
  1. 绿色部分:接受文件输入;
  2. 蓝色部分:弹出输入框,等待你输入正则表达式;
  3. 橙色部分:弹出输入框,等待你输入剧名;
  4. 黑色部分:逐个处理文件;
  5. 红色第一行:设置环境,预防脚本出错;
  6. 红色第二行:提取季和集字段;
  7. 红色第三行:提取文件所在文件夹路径;
  8. 红色第四行:用文件夹路径、提取出的字段加上文件拓展名拼成新的文件名,并进行重命名。
也许你已经注意到,脚本中的正则表达式部分用了 \\,写两遍 \ 的目的是为了避免 Automator 把 \ 认错成分隔符而运行出错。实际使用时,照常输入单个 \ 就可以了。
最后,脚本附上,你可以自由修改使用。
OLDIFS="$IFS"
IFS=$'\n'

read -r -d '' applescriptCode1 <<'EOF'
set regText to text returned of (display dialog "请输入正则表达式" default answer "S\\d\\dE\\d\\d")
return regText
EOF

regText=$(osascript -e "$applescriptCode1")

read -r -d '' applescriptCode2 <<'EOF'
set dialogText to text returned of (display dialog "请输入剧名" default answer "")
return dialogText
EOF

dialogText=$(osascript -e "$applescriptCode2")

while read f; do
PATH=$PATH:/usr/local/bin/
newname=$(echo $f | egrep "$regText" -o)
dir=$(dirname "$f")
mv "$f" "$dir/$dialogText-$newname.${f##*.}"
done

结语

至此,从最基础的 Finder 自带方案,到进阶一些的 Automator 自动化工作流,再到自定义程度最高的正则表达式,我们对于文件批量重命名已经有了一套全面的方案。在掌握了重命名的思路之后,用起 Renamer 或其他的现成工具也就更加得心应手了。
选择 Automator 作为本文主要介绍的自动化工具,是因为它作为 macOS 自带的工具,每个 Mac 用户都用得到,雨露均沾嘛,况且 Automator 的功能也的确挺丰富的。而其中的脚本,稍作修改也能用到 Keyboard Maestro、LaunchBar 这些自动化工具里。
最后说说这个脚本解决法,它的原理理解起来的确有不小的门槛,不够人性化,要是你更喜欢现成的工具,并且不介意花一点钱,A Better Finder Rename 同样值得一用。

上一期
第 45 周预告:App Store 十周年了,有哪些 App 是你换了又换的?
下一期
如何用语音控制电脑
 
精选评论(2) 我的评论
  • vkvka
    请问有windows系统的批量改文件名的办法么?
    07月15日
    • 少数派编辑部
      基础方式可以用右键菜单中的重命名,现成工具可选 ReNamer
      07月15日
  • Mmmw
    好像同样的功能用 Keyboard Maestro 同样可以实现哦
    07月14日