linux的rename命令详解

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 默认)
  • 输出包含perlFile::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' *.txt
2. 批量修改文件扩展名

bash

运行

# 将所有 .txt 改为 .md($ 匹配文件名结尾,避免误改中间字符) rename 's/\.txt$/.md/' *.txt # 将所有 .jpeg 改为 .jpg rename 's/\.jpeg$/.jpg/' *.jpeg
3. 批量添加前缀 / 后缀

bash

运行

# 给所有 .jpg 文件添加 prefix_ 前缀(^ 匹配文件名开头) rename 's/^/prefix_/' *.jpg # 给所有 .log 文件在扩展名前添加 _backup 后缀 rename 's/(\.log)$/_backup$1/' *.log
4. 批量删除字符串

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.txtfile2.txtfile10.txt统一格式化为file001.txtfile002.txtfile010.txt

bash

运行

# /e 修饰符表示替换部分作为 Perl 代码执行 rename 's/file(\d+)/sprintf("file%03d", $1)/e' *.txt
8. 复杂文件名提取重组

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 *.txt
2. 批量修改文件扩展名

bash

运行

# 将所有 .txt 改为 .md rename .txt .md *.txt # 将所有 .jpeg 改为 .jpg rename .jpeg .jpg *.jpeg
3. 批量删除字符串

bash

运行

# 删除所有文件名中第一个 _tmp 字符串 rename _tmp "" *.txt
4. 替换文件名中的空格

bash

运行

# 将文件名中第一个空格替换为下划线 rename " " _ *
5. 变通实现加前缀

util-linux 版不支持直接在开头加前缀,需利用文件名统一的前缀变通实现:

bash

运行

# 所有文件都以 img 开头,替换 img 为 prefix_img,实现加前缀 rename img prefix_img img*.jpg

四、两个版本全面对比

表格

特性Perl 版 renameutil-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 *.txt

2. 递归批量重命名(配合 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 循环优势:无需额外安装,全系统兼容,逻辑更灵活可控

六、避坑重点

  1. 版本混淆是第一大坑不要直接照搬网上的教程,先确认自己系统的 rename 版本,否则命令会完全报错或无效果。CentOS 用户安装 Perl 版后请使用prename命令。

  2. 重名覆盖风险如果重命名后多个文件会变成同一个名字,后处理的文件会覆盖先处理的文件。务必先预览,确认不会出现重名冲突。

  3. 目录也会被重命名rename 默认会同时匹配文件和目录,如果只想处理文件,务必配合find -type f使用。

  4. 通配符匹配范围重命名前可用ls *.txt先确认通配符匹配的文件范围,避免误改无关文件。

七、常用场景速查表

Perl 版常用命令

表格

需求命令
全局替换 old 为 newrename 's/old/new/g' *
修改 .txt 为 .mdrename 's/\.txt$/.md/' *.txt
添加 prefix_ 前缀rename 's/^/prefix_/' *
删除 test_ 前缀rename 's/^test_//' *
空格替换为下划线rename 's/ /_/g' *
文件名统一转小写rename 'y/A-Z/a-z/' *

util-linux 版常用命令

表格

需求命令
替换第一个 old 为 newrename old new *
修改 .txt 为 .mdrename .txt .md *.txt
删除第一个 _tmp 字符串rename _tmp "" *
替换第一个空格为下划线rename " " _ *