在Linux系统中,重命名文件主要通过两种命令实现:mv适用于单个文件或目录的重命名,rename支持批量处理。本文从语法、参数、使用场景及底层原理角度,对二者进行系统说明。
一、基础命令:mv
1.1 基本语法
mv[选项]源文件 目标文件1.2 使用示例
| 场景 | 命令 |
|---|---|
| 重命名当前目录下的文件 | mv old.txt new.txt |
| 重命名其他路径的文件(同时移动位置) | mv /home/user/old.txt /home/user/new.txt |
1.3 常用选项
| 选项 | 含义 |
|---|---|
-i | 交互模式:若目标文件已存在,提示用户是否覆盖 |
-f | 强制模式:直接覆盖,不提示 |
-n | 不覆盖已存在的目标文件 |
-v | 显示执行过程详细信息 |
1.4 注意事项
mv同时承担文件移动和重命名两种功能。当源路径与目标路径相同时,行为为重命名;路径不同时,行为为移动文件并重命名。- 默认情况下,若目标文件名已存在,
mv会直接覆盖而不提示,建议在关键操作中使用-i选项。
二、批量重命名命令:rename
2.1 安装方法
| 发行版 | 安装命令 |
|---|---|
| Debian/Ubuntu/银河麒麟 | sudo apt install rename |
| CentOS/RHEL | sudo yum install prename |
2.2 基本语法
rename's/原字符串/新字符串/'匹配文件模式该命令使用Perl正则表达式进行替换操作。
2.3 使用示例
| 需求 | 命令 |
|---|---|
将所有.txt文件改为.md | rename 's/\.txt$/.md/' *.txt |
将所有文件名中的test替换为demo | rename 's/test/demo/' * |
| 将所有文件名中的空格替换为下划线 | rename 's/ /_/g' * |
| 将大写扩展名统一转为小写 | rename 's/\.JPG$/.jpg/' *.JPG |
2.4 注意事项
- 通配符
*表示匹配当前目录下所有文件,可使用更具体的模式(如*.txt)缩小范围。 - 正则表达式中的特殊字符需转义,如
.需写作\.,$表示行尾。 rename命令存在多个变体(Perl版和util-linux版),语法有差异。上述示例基于Perl版(Debian系默认),CentOS安装的prename同样适用该语法。
三、mv与rename对比
| 对比维度 | mv | rename |
|---|---|---|
| 适用场景 | 单文件或少量文件重命名 | 批量重命名、格式转换 |
| 正则支持 | 不支持 | 支持(Perl正则) |
| 交互确认 | 支持(-i) | 不支持(需谨慎匹配) |
| 是否可移动位置 | 是(路径不同时) | 否(仅修改文件名) |
| 内置性 | 所有Linux系统内置 | 需额外安装 |
四、批量重命名脚本模板
以下脚本可将当前目录下所有.txt文件重命名为带日期前缀的形式,避免覆盖:
#!/bin/bash# 批量重命名:为所有txt文件添加当前日期前缀prefix=$(date+%Y%m%d)forfilein*.txt;domv-i"$file""${prefix}_${file}"done执行:
chmod+x rename_script.sh ./rename_script.sh五、底层原理简述
- mv:系统调用
rename()或link()+unlink()实现。若源与目标在同一文件系统,仅修改目录项(dentry);若跨文件系统,则执行复制后删除源文件。 - rename:Perl脚本封装了正则替换逻辑,实质仍调用
mv或系统rename()完成每个文件的重命名操作。
六、常见问题
mv时目标文件已存在是否可恢复?
覆盖后无法恢复,建议先备份或使用-i确认。rename修改后如何预览效果?
执行时加上-n参数(试运行模式),仅显示修改结果而不实际执行:rename-n's/\.txt$/.md/'*.txt文件名含空格或特殊字符如何处理?
mv和rename均支持,但需对文件名加引号(如mv "my file.txt" newfile.txt);使用rename时通配符*正常工作。