linux的rename命令详解
Linux rename 命令超详细详解
rename是 Linux 系统中批量重命名文件 / 目录的专用命令,相比mv配合循环的写法更简洁高效。但它有两个语法完全不兼容的主流实现,这是绝大多数用户踩坑的根源:
- Perl 版 rename(prename):功能强大,支持完整 Perl 正则表达式,适合复杂批量重命名,Ubuntu/Debian 默认预装,CentOS/RHEL 需额外安装。
- util-linux 版 rename:语法简单,仅支持固定字符串替换,功能较弱,CentOS/RHEL 默认预装。
⚠️ 关键第一步:先确认你的系统是哪个版本,否则命令会完全报错或无效果。
一、版本判断与安装
1. 判断当前版本
执行以下命令,根据输出区分:
bash
运行
rename --version- 输出包含
util-linux→ util-linux 版(CentOS/RHEL 默认) - 输出包含
perl或File::Rename→ Perl 版(Ubuntu/Debian 默认)
2. 安装对应版本
bash
运行
# Ubuntu/Debian 安装 Perl 版(系统默认已预装) sudo apt install rename # CentOS/RHEL 安装 Perl 版(需先启用 EPEL 源,安装后命令名为 prename,避免与系统自带版本冲突) sudo yum install epel-release sudo yum install prename # CentOS/RHEL 默认自带 util-linux 版,无需安装二、Perl 版 rename(prename)详解
核心原理
基于 Perl 正则表达式执行替换,语法格式为s/原模式/替换模式/修饰符,和 Perl 语言的替换运算符完全一致,支持捕获组、大小写转换、代码执行等高级特性。
基础语法
bash
运行
rename [选项] '正则表达式' 文件名列表- 正则表达式:标准 Perl 替换格式
s/匹配规则/替换内容/修饰符,必须用单引号包裹避免 Shell 解析 - 文件名列表:支持通配符,如
*.txt、*.jpg、*
核心参数
表格
| 参数 | 含义 | 最常用场景 |
|---|---|---|
-n/--no-act | 预览模式:只显示会修改的文件,不实际执行重命名 | 执行前验证效果,强烈建议必用 |
-v/--verbose | 显示详细的重命名过程 | 确认执行结果 |
-f/--force | 强制覆盖已存在的目标文件 | 目标文件已存在时强制覆盖 |
-h/--help | 显示帮助信息 | 快速查阅参数 |
高频实战示例
1. 基础字符串替换
bash
运行
# 预览:将所有 .txt 文件名中第一个 old 替换为 new rename -n 's/old/new/' *.txt # 实际执行 rename 's/old/new/' *.txt # 全局替换:文件名中所有 old 都替换为 new(加 /g 修饰符) rename 's/old/new/g' *.txt2. 批量修改文件扩展名
bash
运行
# 将所有 .txt 改为 .md($ 匹配文件名结尾,避免误改中间字符) rename 's/\.txt$/.md/' *.txt # 将所有 .jpeg 改为 .jpg rename 's/\.jpeg$/.jpg/' *.jpeg3. 批量添加前缀 / 后缀
bash
运行
# 给所有 .jpg 文件添加 prefix_ 前缀(^ 匹配文件名开头) rename 's/^/prefix_/' *.jpg # 给所有 .log 文件在扩展名前添加 _backup 后缀 rename 's/(\.log)$/_backup$1/' *.log4. 批量删除字符串
bash
运行
# 删除所有文件名中的 test_ 前缀 rename 's/^test_//' *.txt # 删除所有文件名中的 _tmp 字符串(全局删除) rename 's/_tmp//g' *5. 大小写转换
bash
运行
# 所有文件名转为小写 rename 'y/A-Z/a-z/' * # 所有文件名转为大写 rename 'y/a-z/A-Z/' * # 每个单词首字母大写 rename 's/\b(\w)/\U$1/g' *6. 批量替换空格为下划线
bash
运行
# 将文件名中的所有空格替换为下划线,解决文件名含空格的不便 rename 's/ /_/g' *7. 数字序号格式化(补零)
将file1.txt、file2.txt、file10.txt统一格式化为file001.txt、file002.txt、file010.txt:
bash
运行
# /e 修饰符表示替换部分作为 Perl 代码执行 rename 's/file(\d+)/sprintf("file%03d", $1)/e' *.txt8. 复杂文件名提取重组
将2026-06-27_旅行照片_001.jpg格式重命名为001_旅行照片.jpg:
bash
运行
rename 's/(\d{4}-\d{2}-\d{2})_(.*)_(\d{3})\.jpg/$3_$2.jpg/' *.jpg三、util-linux 版 rename 详解
核心特点
语法极简,仅支持固定字符串的一对一替换,不支持正则表达式、位置匹配、大小写转换,仅适合最简单的批量重命名场景。
基础语法
bash
运行
rename [选项] 原字符串 新字符串 文件名列表- 原字符串:要被替换的固定子串
- 新字符串:替换后的字符串
- 文件名列表:支持通配符
⚠️ 注意:默认只替换文件名中第一个匹配的原字符串,并非全局替换。
核心参数
表格
| 参数 | 含义 | 最常用场景 |
|---|---|---|
-v/--verbose | 显示详细的重命名过程 | 确认执行结果 |
-n/--no-act | 预览模式:只显示不执行 | 执行前验证效果 |
-f/--force | 强制覆盖已存在的目标文件 | 目标文件已存在时强制覆盖 |
-V/--version | 显示版本信息 | 确认版本 |
高频实战示例
1. 基础字符串替换
bash
运行
# 将所有 .txt 文件名中第一个 old 替换为 new rename old new *.txt2. 批量修改文件扩展名
bash
运行
# 将所有 .txt 改为 .md rename .txt .md *.txt # 将所有 .jpeg 改为 .jpg rename .jpeg .jpg *.jpeg3. 批量删除字符串
bash
运行
# 删除所有文件名中第一个 _tmp 字符串 rename _tmp "" *.txt4. 替换文件名中的空格
bash
运行
# 将文件名中第一个空格替换为下划线 rename " " _ *5. 变通实现加前缀
util-linux 版不支持直接在开头加前缀,需利用文件名统一的前缀变通实现:
bash
运行
# 所有文件都以 img 开头,替换 img 为 prefix_img,实现加前缀 rename img prefix_img img*.jpg四、两个版本全面对比
表格
| 特性 | Perl 版 rename | util-linux 版 rename |
|---|---|---|
| 核心能力 | 支持完整 Perl 正则,功能极强 | 仅支持固定子串替换,功能有限 |
| 语法格式 | rename 's/old/new/' 文件 | rename old new 文件 |
| 全局替换 | 加/g修饰符支持 | ❌ 默认仅替换第一个匹配项 |
| 大小写转换 | ✅ 支持 | ❌ 不支持 |
| 开头 / 结尾位置匹配 | ✅ 支持(^/$) | ❌ 不支持,只能替换任意子串 |
| 序号格式化、内容重组 | ✅ 支持 | ❌ 不支持 |
| 默认发行版 | Ubuntu/Debian 系列 | CentOS/RHEL 系列 |
| 学习成本 | 稍高(需基础正则知识) | 极低 |
| 适用场景 | 复杂批量重命名 | 简单固定字符串替换 |
五、高级用法与最佳实践
1. 永远先预览再执行
不管哪个版本,执行重命名前务必加-n参数预览效果,确认无误后再去掉-n实际执行,这是避免数据混乱的黄金法则:
bash
运行
# Perl 版预览 rename -n 's/old/new/' *.txt # util-linux 版预览 rename -n old new *.txt2. 递归批量重命名(配合 find)
rename 默认只处理当前目录,配合find可以递归处理所有子目录中的文件:
bash
运行
# Perl 版:递归将所有 .txt 改为 .md find . -type f -name "*.txt" -exec rename 's/\.txt$/.md/' {} + # util-linux 版:递归替换文件名中的 old 为 new find . -type f -name "*old*" -exec rename old new {} +加
-type f只处理文件,避免误改目录名。
3. 处理含特殊字符的文件名
两个版本都能正常处理含空格、中文、特殊符号的文件名,只要通配符或 find 能匹配到即可,无需额外转义。
4. 与 mv 循环的选择
简单场景下,mv配合 for 循环也能实现批量重命名,兼容性最强:
bash
运行
# 批量加前缀的 mv 写法 for file in *.jpg; do mv "$file" "prefix_$file" done- rename 优势:代码更简洁,性能更好,内置预览和防错机制
- mv 循环优势:无需额外安装,全系统兼容,逻辑更灵活可控
六、避坑重点
版本混淆是第一大坑不要直接照搬网上的教程,先确认自己系统的 rename 版本,否则命令会完全报错或无效果。CentOS 用户安装 Perl 版后请使用
prename命令。重名覆盖风险如果重命名后多个文件会变成同一个名字,后处理的文件会覆盖先处理的文件。务必先预览,确认不会出现重名冲突。
目录也会被重命名rename 默认会同时匹配文件和目录,如果只想处理文件,务必配合
find -type f使用。通配符匹配范围重命名前可用
ls *.txt先确认通配符匹配的文件范围,避免误改无关文件。
七、常用场景速查表
Perl 版常用命令
表格
| 需求 | 命令 |
|---|---|
| 全局替换 old 为 new | rename 's/old/new/g' * |
| 修改 .txt 为 .md | rename 's/\.txt$/.md/' *.txt |
| 添加 prefix_ 前缀 | rename 's/^/prefix_/' * |
| 删除 test_ 前缀 | rename 's/^test_//' * |
| 空格替换为下划线 | rename 's/ /_/g' * |
| 文件名统一转小写 | rename 'y/A-Z/a-z/' * |
util-linux 版常用命令
表格
| 需求 | 命令 |
|---|---|
| 替换第一个 old 为 new | rename old new * |
| 修改 .txt 为 .md | rename .txt .md *.txt |
| 删除第一个 _tmp 字符串 | rename _tmp "" * |
| 替换第一个空格为下划线 | rename " " _ * |