rename 命令详解
更新时间:2026-08-28。本文是「一个命令一个文档」系列,属于文件与目录命令族(见文件与目录命令族)。几百个文件要统一改名?循环 mv 太累,
rename一句正则搞定。
rename 用 Perl 正则表达式对一批文件名做替换,批量重命名。它是"正则版 mv",适合大量规律性改名。
一、基本用法
bash
rename 's/\.txt$/.md/' *.txt # 把所有 .txt 改成 .md
rename 'y/A-Z/a-z/' * # 把所有文件名转小写(y 是字符映射)
rename 's/ /_/g' * # 空格换成下划线语法是 Perl 的替换表达式:
s/旧/新/或y/集/集/。后面跟要处理的文件(通常通配符)。第一个例子把每个.txt结尾换成.md。
二、先预览(关键)
bash
rename -n 's/\.txt$/.md/' *.txt # -n 干跑,只显示会怎么改,不真改
rename -v 's/\.txt$/.md/' *.txt # -v 实际改并打印每个改动重命名不可逆,务必先
-n预览!确认替换规则无误再去掉-n真执行。-v(verbose)执行时打印每个改名,便于核对。
三、与 mv 循环的区别
bash
# 循环版(等价但啰嗦):
for f in *.txt; do mv "$f" "${f%.txt}.md"; done
# rename 版(一行):
rename 's/\.txt$/.md/' *.txt简单规则用 rename 一行搞定,且自动遍历。但 rename 表达力强(正则),复杂条件(如按 mtime、跨目录)还是 for 循环 + mv(见mv)更灵活可控。
四、发行版差异(重要坑)
bash
# Debian/Ubuntu:Perl rename(上面语法)
# CentOS/RHEL:util-linux 的 rename,语法不同:rename 原串 新串 文件
# rename .txt .md *.txt # 这里是"字面替换",不是正则!两个 rename 不兼容!Red Hat 系那个是"字面字符串替换"(无正则),Debian 系是 Perl 正则版。写跨发行版脚本别依赖 rename,改用
for+mv 或mmv更稳。
一句话总结
rename = 正则批量重命名(Perl 版):rename 's/旧/新/' 文件 一行搞定规律改名;务必先 -n 干跑预览再真执行(不可逆);与 for f in *; do mv ... 等价但更短。大坑:Debian 系是 Perl 正则、RedHat 系是字面替换(语法不同),跨发行版脚本改用 mv 循环更稳。