Linux `rename` 命令详解

🐧 Linux rename 命令详解

📌 学习目标

  1. 理解 rename 命令的基本功能及其在批量重命名文件中的作用
  2. 掌握 Perl 风格与传统的 rename 用法区别,适应不同 Linux 发行版
  3. 能够结合正则表达式进行高级批量重命名操作,提升运维和开发效率

🔍 核心重点

版本 支持情况 说明
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,但又需要正则功能,可以结合 mvfor 循环:

for f in *.JPG; do
    mv "$f" "${f%.JPG}.jpg"
done

📌 说明:

  • ${f%.JPG} 表示去除变量结尾的 .JPG
  • 类似于 rename 's/\.JPG$/.jpg/' *.JPG

🧯 安全警告与建议

  1. 批量操作前务必使用 -n 模拟运行:防止误删或重命名错误
  2. 避免在根目录下使用通配符:如 rename 's/a/b/' * 可能导致系统崩溃
  3. 注意文件名冲突问题:尤其是加前缀或去后缀时
  4. 不要在生产环境直接操作原始数据:建议先复制一份副本再重命名

🧰 其他相关命令推荐

命令 功能
mv 单个文件移动或重命名
basename 去除路径或后缀
sed 字符串替换,可用于构造新文件名
find + exec 结合查找与重命名
mmv 另一个图形化风格的批量重命名工具

🧠 总结

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

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


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

  • mmv:图形界面风格的批量重命名工具
  • find + rename:跨目录多级批量重命名
  • sed + xargs:构建更灵活的文件名处理管道

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

追加问题: 如何用 rename 删除文件名中的数字?
posted @ 2025-06-23 22:51  红尘过客2022  阅读(298)  评论(0)    收藏  举报