🐧 Linux rename 命令详解

📌 学习目标

理解 rename 命令的基本功能及其在批量重命名文件中的作用

掌握 Perl 风格与传统的 rename 用法区别,适应不同 Linux 发行版

能够结合正则表达式进行高级批量重命名操作,提升运维和开发效率

🔍 核心重点

版本

支持情况

说明

Perl-style rename

Ubuntu、Debian、Fedora 等主流发行版

功能强大,支持正则表达式

Traditional rename

Alpine、旧版系统等

只能简单替换字符串,不支持正则

语法差异

rename 's/old/new/' * vs rename old new file*

不同版本语法完全不同!

安全建议

使用前建议先测试或备份

批量操作风险高

常用场景

添加前缀、删除后缀、大小写转换、替换空格等

提升自动化处理能力

📌 注意:

在使用前务必确认当前系统的 rename 是哪种风格

建议使用 -n(dry-run)模式先预览效果

📘 详细讲解

🧠 什么是 rename?

rename 是 Linux 中用于批量重命名多个文件的命令。它比 mv 更强大,尤其适合对一组文件执行统一格式的命名修改。

例如:

rename 's/.txt/.log/' *.txt

表示将所有 .txt 文件重命名为 .log 后缀。

🛠️ 基本语法

✅ Perl 风格(推荐)

rename [选项] 'perl_regular_expression' 文件列表

这是最常见也最强大的形式,适用于 Ubuntu、Debian、Fedora 等主流发行版。

示例:

rename 's/\.bak$//' *.bak

表示去掉所有 .bak 文件的后缀。

⚠️ 传统风格(老系统)

rename [选项] 原字符串 新字符串 文件列表

适用于 Alpine、旧版 CentOS/RHEL 等系统。

示例:

rename .txt .log *.txt

表示将 .txt 替换为 .log

📌 重要提示:这两个版本语法完全不同!

💡 参数说明与实战用法

1. -v:显示重命名过程(Verbose)

rename -v 's/\.txt$/.log/' *.txt

输出类似:

test1.txt renamed as test1.log

test2.txt renamed as test2.log

📌 适用场景:

查看具体哪些文件被修改

验证是否符合预期

2. -n:模拟运行(Dry run)

rename -n 's/^/backup_/' *.sql

仅显示将会发生的变化,不实际执行重命名。

输出示例:

test.sql not renamed: backup_test.sql

data.sql not renamed: backup_data.sql

📌 适用场景:

安全检查,避免误操作

确认正则表达式是否匹配正确

3. -f:强制覆盖已有文件(Force)

rename -f 's/^/new_/' old_file.txt

如果存在 new_old_file.txt,会自动覆盖。

⚠️ 谨慎使用!

🔄 rename 与其他命令的组合应用

经典组合一:ls + rename 大小写转换

将所有 .JPG 图片改为小写 .jpg:

rename 's/\.JPG$/.jpg/' *.JPG

或将所有文件名转为小写:

rename 'y/A-Z/a-z/' *.TXT

📌 说明:

y/A-Z/a-z/ 是 Perl 的字符替换语法

类似于 tr 命令的功能

经典组合二:添加前缀/后缀

添加统一前缀:

rename 's/^/image_/' *.png

添加统一后缀:

rename 's/$/.backup/' *.conf

经典组合三:删除部分字符

删除文件名中某个子串:

rename 's/_temp//' *.tmp

删除开头数字编号:

rename 's/^\d+_*//' *.mp3

🧪 实战案例分析

案例一:清理下载目录中的多余空格和特殊字符

你从 Windows 下载了一堆文件,文件名包含空格和中文括号:

rename 's/ /_/g' *

rename 's/(/_/g; s/)/_/g' *

📌 解释:

第一行将空格替换为下划线

第二行将中文括号替换为下划线

案例二:日志文件按日期归档后的重命名

你每天生成一个日志文件,如 app_log_20250623.txt,想按周整理成 week_24_app_log.txt:

rename 's/app_log_(\d{8})/week_24_app_log/' app_log_*.txt

📌 说明:

使用了正则捕获组 (\d{8}),虽然未使用但仍需保留结构

实际可配合 date 命令动态生成周数

案例三:批量删除文件名中某一段内容

你有一组文件名为:

video_part1.mp4

video_part2.mp4

video_part3.mp4

想去掉 _partX:

rename 's/_part\d+//' video_*.mp4

结果变为:

video.mp4

video.mp4

video.mp4

⚠️ 注意重复名称问题!

⚙️ 不同发行版注意事项

发行版

rename 类型

包名

默认路径

Ubuntu

Perl-style

rename

/usr/bin/rename

Debian

Perl-style

rename

/usr/bin/rename

CentOS 8+/RHEL 8+

Perl-style

util-linux

/usr/bin/rename

CentOS 7 及以下

Traditional

util-linux

/usr/bin/rename

Fedora

Perl-style

prename

/usr/bin/prename

Arch Linux

Perl-style

perl-rename

/usr/bin/rename

Alpine Linux

Traditional

busybox

/bin/busybox

macOS

Traditional(默认)

可安装 Perl rename

/usr/local/bin/rename

📌 如何判断当前系统使用哪种风格?

man rename

查看帮助文档是否有“perl”字样,或者直接尝试执行:

rename 's/a/b/' file.txt

如果报错,则可能是传统风格。

🧪 小技巧:在传统 rename 中实现正则替换(Alpine/Linux From Scratch)

如果你只能使用传统 rename,但又需要正则功能,可以结合 mv 和 for 循环:

for f in *.JPG; do

mv "$f" "${f%.JPG}.jpg"

done

📌 说明:

${f%.JPG} 表示去除变量结尾的 .JPG

类似于 rename 's/\.JPG$/.jpg/' *.JPG

🧯 安全警告与建议

批量操作前务必使用 -n 模拟运行:防止误删或重命名错误

避免在根目录下使用通配符:如 rename 's/a/b/' * 可能导致系统崩溃

注意文件名冲突问题:尤其是加前缀或去后缀时

不要在生产环境直接操作原始数据:建议先复制一份副本再重命名

🧰 其他相关命令推荐

命令

功能

mv

单个文件移动或重命名

basename

去除路径或后缀

sed

字符串替换,可用于构造新文件名

find + exec

结合查找与重命名

mmv

另一个图形化风格的批量重命名工具

🧠 总结

rename 是 Linux 中非常强大的批量重命名工具,尤其在 Perl 风格下,几乎可以完成任何复杂的命名规则调整任务。掌握其正则表达式用法,将极大提升你在日常运维、脚本编写、日志管理等工作中的效率。

无论是开发人员处理代码文件、运维人员整理日志、还是普通用户管理媒体资源,rename 都是一个值得深入掌握的利器。

如果你已经掌握了 rename,下一步你可以深入学习:

mmv:图形界面风格的批量重命名工具

find + rename:跨目录多级批量重命名

sed + xargs:构建更灵活的文件名处理管道

如需进一步了解某个具体属性或使用场景,请告诉我:

追加问题: 如何用 rename 删除文件名中的数字?