☰
Linux rename 命令详解:Perl 与 C 语言双版本批量重命名实战指南
2026/10/3 22:27:03 网站建设 项目流程
  • 文档
  • 教程

【免费下载链接】linux-command

Linux命令大全搜索工具,内容包含Linux命令手册、详解、学习、搜集。https://git.io/linux

项目地址:https://gitcode.com/GitHub_Trending/linux/linux-command
点击查看免费下载

rename 是 Linux 下用「字符串替换」方式批量修改文件名的利器,与逐个mv相比,它能一次对大量文件执行统一改名。本文基于本仓库的 command/rename.md 文档展开,完整讲解 Perl 版本(支持正则表达式)与 C 语言版本(支持通配符)的语法、参数与经典实例,并给出版本判别与安全演练方法,读完即可在 Ubuntu、CentOS 等主流发行版上直接落地使用。

本仓库(linux-command)是一个收录了 600 多个 Linux 命令的开源速查手册项目,rename是其中重要的文件管理类命令之一,其说明文档被收录在 command/rename.md,并在 dist/data.json 中登记了/rename详情页路由,可通过仓库生成的 Web 站直接检索查阅。

核心认知:同一命令,两个版本

rename命令在不同发行版中存在两个完全不同的实现,语法与能力差异极大,这是使用它的第一道门槛:

  • C 语言版本:来自 util-linux 工具集,基于通配符(?、*)进行简单替换,适合基础场景;
  • Perl 版本:基于 Perl 的File::Rename模块实现,支持正则表达式,可完成复杂的批量替换、添加、删除后缀等操作。

两者的语法、参数、行为都不同,混用会导致命令执行失败或结果不符合预期,因此使用前必须先确认当前系统装的是哪个版本。

常用通配符与正则符号速查

版本符号含义
C 语言版本?匹配一个任意字符
C 语言版本*匹配一个或一串任意字符
Perl 版本^匹配输入的开始位置
Perl 版本$匹配输入的结尾
Perl 版本.匹配除换行符外的任意字符
Perl 版本+匹配前一个字符一次或多次,例如zo+可以匹配zoo,但不匹配z
Perl 版本[a-z]匹配指定范围内的某个字符,例如[a-z]匹配a与z之间的任何一个小写字母字符
Perl 版本[^m-z]否定的字符区间,匹配不在指定区间内的字符

版本判别:一条命令见分晓

两种版本可以用rename --version直接区分:如果返回结果中包含util-linux,说明是 C 语言版本,反之则是 Perl 版本。

# Perl 版本 | Ubuntu(18)、Mint(20) 默认的是 Perl 版本 $ rename --version /usr/bin/rename using File::Rename version 1.10 # C 语言版本 | Centos(7) 默认的是 C 语言版本 $ rename --version rename,来自 util-linux 2.23.2

从源码角度看,两个版本实现机制完全不同:C 语言版本(util-linux)在重命名时对文件名做的是「字符串替换」,而 Perl 版本(File::Rename)把第一个参数当作 Perl 表达式(s/.../.../替换或任意 Perl 代码)求值,这也是后者能力更强的原因。

语法对比

# Perl 版本 rename [ -h|-m|-V ] [ -v ] [ -0 ] [ -n ] [ -f ] [ -d ] [ -e|-E perlexpr]*|perlexpr [ files ] # C 语言版本 rename [选项] 表达式 替换的字符 文件...

两者的核心差异一目了然:Perl 版本把重命名逻辑写进一个表达式(perlexpr),通常是s/旧/新/形式的替换;C 语言版本则是三段式:给定「表达式」(如txt)、「替换的字符」(如log)和「文件列表」。

参数详解

Perl 版本参数

参数说明
-v, --verbose详细模式:打印成功重命名的文件名称
-0, --null从 STDIN 读取时,使用\0作为记录分隔符(适合配合find ... -print0处理含换行/特殊字符的文件名)
-n, --nono不执行任何操作:只打印将要重命名的文件名,但不真正重命名(演练模式,强烈建议先跑一遍)
-f, --force覆盖模式:允许覆盖已存在的文件
--path, --fullpath重命名完整路径,包含目录组件(默认行为)
-d, --filename, --nopath, --nofullpath不重命名目录:只重命名路径中的文件名部分
-h, --help帮助:打印提要和选项
-m, --man手册:打印手册页
-V, --version版本:显示版本号
-e表达式:作用于文件名的代码。可以重复使用来拼接代码(类似 perl 的-e)。如果没有-e,则第一个参数用作代码
-E语句:对文件名执行操作的代码,用法同-e,但以;结尾

C 语言版本参数

参数说明
-v, --verbose提供视觉反馈,显示哪些文件被重命名(如果有的话)
-V, --version显示版本信息并退出
-s, --symlink在符号链接目标上执行重命名
-h, --help显示帮助文本并退出

实战实例

Perl 版本

将 1.txt、2.txt 重命名为 1.log、2.log

$ rename -v "s/txt/log/g" 1.txt 2.txt 1.txt renamed as 1.log 2.txt renamed as 2.log

这里-v会打印每一次改名的前后对照;s/txt/log/g是 Perl 替换表达式,g修饰符表示全局替换(文件名中所有txt都会被替换,而不只是第一个)。

修改文件的后缀:把 .html 后缀改成 .php 后缀

rename "s/\.html/\.php/" * # 把 .html 后缀的文件改成 .php 后缀

原文档中的写法为s//.html//.php/,这是 Markdown 转义导致的显示形式;实际执行时建议对.做转义(\.),避免点号在正则中被当作「任意字符」匹配。本仓库的 command/rename.md 中保留了原始示例写法,理解其本意即可。

批量添加文件后缀:让所有文件名都以 .txt 结尾

rename "s/$/\.txt/" * # 在文件名末尾追加 .txt

$锚定到文件名结尾,在结尾处插入.txt,相当于给所有文件统一补上后缀。

批量删除文件名后缀:把所有以 .txt 结尾的文件名去掉 .txt

rename "s/\.txt//" * # 删除文件名末尾的 .txt

将.txt替换为空字符串即可完成「去后缀」操作。注意这里没有g修饰符,只替换第一处匹配;若文件名中间也有.txt想一并删掉,可加g。

C 语言版本

将 1.txt、2.txt 重命名为 1.log、2.log

$ rename -v txt log 1.txt 2.txt `1.txt' -> `1.log' `2.txt' -> `2.log'

C 语言版本同样是三段式:把文件名中的txt字符串替换为log。

数字补零场景:假设文件夹中有foo1到foo9、foo10到foo278等文件,利用通配符控制重命名范围:

# 把 foo1 到 foo9 重命名为 foo01 到 foo09: # 只重命名 4 个字符长度的名称,文件名中的 foo 被替换为 foo0 rename foo foo0 foo? # 把 foo01 到 foo99 的所有文件重命名为 foo001 到 foo099: # 只重命名 5 个字符长度的名称,文件名中的 foo 被替换为 foo0 rename foo foo0 foo?? # 把 foo001 到 foo278 的所有文件重命名为 foo0001 到 foo0278: # 所有以 foo 开头的文件都被重命名 rename foo foo0 foo* # 把 foo0200 到 foo0278 的所有文件重命名为 foo200 到 foo278: # 文件名中的 foo0 被替换为 foo rename foo0 foo foo0[2]*

这几个例子非常经典,展示了 C 语言版本如何用通配符精确圈定重命名范围:foo?匹配 4 字符文件名(如foo1),foo??匹配 5 字符文件名(如foo10),foo*匹配所有foo开头的文件,而foo0[2]*则精确匹配foo02...起始的文件段,实现按数字区间局部改名。

安全使用与常见注意事项

  1. 先演练再执行:Perl 版本务必先加-n(nono 模式)或-v查看将要发生的改名,确认无误后再真正执行;C 语言版本同样可用-v观察反馈。
  2. 注意覆盖风险:Perl 版本加-f才会允许覆盖同名文件,不加则默认保护现有文件,避免误覆盖。
  3. 符号链接处理:C 语言版本默认只改链接名本身,需要重命名链接目标时加-s。
  4. 特殊文件名:文件名含空格或换行时,Perl 版本的-0(配合\0分隔符)能安全处理来自 STDIN 的输入。
  5. 路径与文件名:Perl 版本默认重命名完整路径,只希望改文件名部分(保留目录)时加-d。
  6. 正则转义:Perl 版本中.是正则元字符,匹配字面点号必须写成\.,否则替换范围会超出预期。

扩展:在 linux-command 仓库中的定位

rename文档只是本仓库 600 多个命令手册中的一篇。仓库通过 scripts/dash.mjs 将 command 目录下的 Markdown 批量生成文档集数据(写入 dist/data.json),其中rename条目(dist/data.json)登记了名称rename、路径/rename与摘要「用字符串替换的方式批量改变文件名」,再由 template/details.ejs 渲染为可检索的 Web 详情页。你可以直接阅读 command/rename.md 原文,或在该仓库生成的站点中搜索rename快速查阅本文涉及的全部参数与实例。

  • 文档
  • 教程

【免费下载链接】linux-command

Linux命令大全搜索工具,内容包含Linux命令手册、详解、学习、搜集。https://git.io/linux

项目地址:https://gitcode.com/GitHub_Trending/linux/linux-command
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询