如何在macOS终端用Perl版rename批量重命名文件为自定义字符串加索引
使用Perl版rename批量重命名文件为自定义字符串加索引
核心命令
先运行预览命令确认重命名效果(不会实际修改文件):
rename -n 'our $i=1; s/^.*(\.\w+)$/bar' . $i++ . $1/e' *.png
确认无误后,去掉-n执行实际重命名:
rename 'our $i=1; s/^.*(\.\w+)$/bar' . $i++ . $1/e' *.png
命令详解
-n:预览模式,仅输出将要执行的重命名操作,用于验证规则是否正确,避免误操作。our $i=1:声明一个全局计数器变量并初始化为1,确保处理第一个文件时索引从1开始(若用my $i=1,每次处理文件都会重置计数器,导致所有文件都被命名为bar1.png)。- 正则表达式与替换逻辑:
s/^.*(\.\w+)$/.../e:Perl正则替换语句,/e修饰符表示替换部分会作为Perl代码执行(而非普通字符串)。^.*:匹配文件名中从开头到扩展名前的所有字符。(\.\w+)$:捕获文件的扩展名(包括前面的点,比如.png),捕获的内容会保存在变量$1中。
'bar' . $i++ . $1:将自定义字符串bar、递增的索引值(每次处理文件后计数器加1)、捕获的扩展名拼接成新文件名。
*.png:Shell通配符,匹配当前目录下所有.png格式的文件,和你习惯的通配符用法一致。
分步操作
- 进入目标文件夹:
cd foo
- 运行预览命令,检查输出的重命名规则是否符合预期:
rename -n 'our $i=1; s/^.*(\.\w+)$/bar' . $i++ . $1/e' *.png
- 确认预览结果无误后,执行实际重命名:
rename 'our $i=1; s/^.*(\.\w+)$/bar' . $i++ . $1/e' *.png
额外技巧
- 按文件排序重命名:如果需要按文件修改时间排序(比如从旧到新),可以结合
ls命令:
ls -tr *.png | rename 'our $i=1; s/^.*(\.\w+)$/bar' . $i++ . $1/e'
-tr表示按修改时间逆序(旧文件在前),去掉r则是新文件在前。- 处理所有扩展名的文件:如果需要重命名当前目录下所有文件(不管扩展名),可以修改正则和通配符:
rename -n 'our $i=1; s/^(.+)(\.\w+)?$/bar' . $i++ . ($2//'')/e' *
- 此命令会给无扩展名的文件直接命名为
bar1、bar2等。
常见疑惑解答
- 关于
*的作用:这里的*就是标准Shell通配符,用来指定要处理的文件范围,和你日常使用的通配符完全一致。之前看到的-s参数是简单字符串替换模式,而我们这里使用的是Perl正则替换模式,因此不需要-s。 - Perl正则与"常规"正则的差异:大部分基础语法(比如捕获组、匹配规则)是一致的,Perl正则只是增加了更多高级特性(比如
/e修饰符),本次用到的语法都是通用正则的延伸,容易理解和复用。
内容的提问来源于stack exchange,提问作者Blue badger
相关产品推荐
相关产品推荐

