- 文档
- 教程
【免费下载链接】linux-command
Linux命令大全搜索工具,内容包含Linux命令手册、详解、学习、搜集。https://git.io/linux
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...起始的文件段,实现按数字区间局部改名。
安全使用与常见注意事项
- 先演练再执行:Perl 版本务必先加
-n(nono 模式)或-v查看将要发生的改名,确认无误后再真正执行;C 语言版本同样可用-v观察反馈。 - 注意覆盖风险:Perl 版本加
-f才会允许覆盖同名文件,不加则默认保护现有文件,避免误覆盖。 - 符号链接处理:C 语言版本默认只改链接名本身,需要重命名链接目标时加
-s。 - 特殊文件名:文件名含空格或换行时,Perl 版本的
-0(配合\0分隔符)能安全处理来自 STDIN 的输入。 - 路径与文件名:Perl 版本默认重命名完整路径,只希望改文件名部分(保留目录)时加
-d。 - 正则转义: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
相关推荐
Flue Agent 框架实战:用可编程 TypeScript Harness 构建自主智能体,并用 @flue/sdk 消费对话
Flue Agent 框架实战:用可编程 TypeScript Harness 构建自主智能体,并用 @flue/sdk 消费对话 Flue 是一个以“可编程
文档教程Sketch批量重命名神器 - Rename It插件详解
Sketch批量重命名神器 Rename It插件详解 Rename It是一款专为Sketch设计师打造的批量重命名插件,能够帮助用户快速、高效地管理和组织设
桌面应用设计系统Sketch批量重命名利器Rename It插件详解
Sketch批量重命名利器Rename It插件详解 Rename It是一款专为Sketch设计师打造的批量重命名插件,能够帮助用户快速、批量地重命名图层和画
桌面应用设计系统
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考