mv 命令 (Move/Rename)
mv 命令是 "move" 的缩写,它的核心功能是移动文件或目录,但当源和目标在同一个目录下时,它的行为就变成了“重命名”。

基本语法
mv [选项] 源文件 目标文件 mv [选项] 源目录 目标目录
重命名单个文件
这是 mv 最简单的用法。
示例: 将 old_name.txt 重命名为 new_name.txt
mv old_name.txt new_name.txt
重命名目录
mv 同样可以用来重命名整个目录。
示例: 将 old_folder 重命名为 new_folder

mv old_folder new_folder
mv 的局限性
mv 一次只能处理一个文件的重命名(除非配合通配符和循环),如果你想批量重命名,比如将所有 .txt 文件的后缀改为 .md,mv 本身无法直接完成,需要结合 for 循环等其他命令。
示例: 使用 for 循环批量重命名
# 将当前目录下所有 .txt 文件的后缀改为 .md
for file in *.txt; do
mv "$file" "${file%.txt}.md"
done
"${file%.txt}"是一种参数扩展,它会移除变量$file末尾的.txt字符串。
rename 命令 (批量重命名)
rename 命令是专门为批量重命名而设计的,非常强大和灵活。注意: rename 命令在 Linux 和 macOS 上的实现不同,这是一个非常重要的区别。
Linux 上的 rename (Perl 版本)
现代 Linux 发行版(如 Ubuntu, Debian, CentOS 7+)通常安装的是基于 Perl 的 rename 命令,功能非常强大。

基本语法
rename 'Perl表达式' 文件列表
工作原理: rename 会将 Perl表达式 应用到 文件列表 中的每一个文件名上,如果表达式返回真,则执行重命名操作。
常用示例:
示例 1:批量修改文件后缀
将当前目录下所有 .txt 文件的后缀改为 .md。
rename 's/\.txt$/\.md/' *.txt
s/.../.../:这是 Perl 的替换操作符。\.txt$:匹配以.txt结尾的文件名。\是转义符, 表示字符串末尾。\.md:替换为.md。
示例 2:批量添加前缀
给所有 .jpg 文件名前添加 prefix_。
rename 's/^/prefix_/' *.jpg
^:匹配字符串的开头。
示例 3:批量删除后缀
移除所有 .bak 文件的后缀。
rename 's/\.bak$//' *.bak
- 替换部分为空 ,表示删除匹配的内容。
示例 4:批量修改文件名中的字符
将所有文件名中的 old_string 替换为 new_string。
rename 's/old_string/new_string/' *
示例 5:将文件名转为小写
将所有文件名转换为小写。
rename 'y/A-Z/a-z/' *
y/.../.../是 Perl 的字符替换操作符。
macOS 上的 rename (BSD 版本)
macOS 自带的 rename 命令功能相对简单,语法也完全不同。
基本语法
rename -n old_string new_string 文件列表
-n:非常重要! 这个选项表示 "no-op"(只显示将要做什么,但不实际执行),为了安全起见,第一次运行时最好都带上它,确认无误后再去掉-n。
常用示例:
示例 1:批量修改文件后缀
将所有 .txt 文件的后缀改为 .md。
# 先预览 rename -n .txt .md *.txt # 确认无误后,执行 rename .txt .md *.txt
示例 2:批量添加前缀
给所有 .jpg 文件名前添加 prefix_。
# 先预览 rename -n '' 'prefix_' *.jpg # 确认无误后,执行 rename '' 'prefix_' *.jpg
- 将
old_string设为空,表示在文件名开头插入new_string。
prename 命令 (Perl 版本的替代方案)
如果你在 macOS 上想使用 Linux 那样强大的 Perl 版本 rename,或者你的 Linux 系统上安装的是旧版 rename,一个很好的替代方案是安装 prename。prename 通常是 rename 的一个符号链接,指向 Perl 脚本,其行为与 Linux 上的 Perl 版本 rename 完全一致。
在 macOS 上,可以使用 Homebrew 安装:
brew install rename
安装后,命令名就是 rename,但它已经是功能强大的 Perl 版本了。
总结与对比
| 特性 | mv 命令 |
rename (Linux Perl) |
rename (macOS BSD) |
|---|---|---|---|
| 主要用途 | 移动文件、重命名单个文件 | 批量重命名 | 简单的批量重命名 |
| 语法 | mv old_name new_name |
rename 's/old/new/' files |
rename old new files |
| 灵活性 | 低,需要结合循环实现批量 | 极高,支持复杂的 Perl 正则表达式 | 低,仅支持简单的字符串替换 |
| 学习曲线 | 非常简单 | 较高,需要了解 Perl 正则表达式 | 简单 |
| 默认安装 | 所有 Unix/Linux/macOS | 大多数现代 Linux 发行版 | macOS 系统自带 |
| 推荐场景 | 日常的单个文件/目录重命名 | 任何复杂的批量重命名任务 | 简单的、统一的字符串替换任务 |
如何确定你使用的是哪个 rename?
你可以在终端中运行 man rename 查看手册页,如果手册页的内容涉及 Perl 正则表达式,那么你使用的是 Perl 版本,如果内容非常简短,只描述了 -n 等几个简单选项,那么你使用的是 BSD 版本。
# 查看手册页 man rename # 或者查看命令的详细路径 which rename # /usr/bin/rename (通常是 Linux Perl 版本) # /usr/bin/rename (macOS 上是 BSD 版本) # /opt/homebrew/bin/rename (macOS 上通过 Homebrew 安装的 Perl 版本)
实践建议:
- 对于单个文件的重命名,直接使用
mv即可。 - 对于复杂的批量重命名,强烈推荐使用 Linux Perl 版本的
rename,如果你在 macOS 上,建议通过brew install rename安装它。 - 如果你只需要做一些非常简单的批量替换,并且你确定自己使用的是 macOS,那么自带的 BSD
rename也可以应付,但请务必记得先用-n选项预览。
