Linux `rename` 命令详解
🐧 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 删除文件名中的数字?

浙公网安备 33010602011771号