mv 命令是 "move"(移动)的缩写,但它的功能远不止于此,它主要有两个核心作用:

- 移动文件或目录:将一个或多个文件/目录从一个位置移动到另一个位置。
- 重命名文件或目录:将一个文件或目录的名字更改为另一个名字。
这两个功能本质上是一样的,因为重命名可以看作是在同一个目录下的“移动”。
基本语法
mv [选项] 源文件/目录 目标文件/目录
- 选项:用于控制
mv命令的行为,-i,-f,-v等。 - 源文件/目录:你想要移动或重命名的文件或路径。
- 目标文件/目录:你想要移动到的位置或新的名称。
核心功能详解
移动文件/目录
这是 mv 最常见的用法,类似于 Windows 中的“剪切+粘贴”。
示例 1:移动单个文件
# 将当前目录下的 'report.txt' 文件移动到 '/home/user/documents/' 目录 mv report.txt /home/user/documents/
示例 2:移动整个目录

# 将当前目录下的 'my_project' 目录移动到 '/home/user/projects/' 目录 mv my_project /home/user/projects/
示例 3:移动多个文件到同一目录
# 将 'file1.txt', 'file2.txt', 'file3.jpg' 全部移动到 '/tmp' 目录 mv file1.txt file2.txt file3.jpg /tmp/
重命名文件/目录
当源和目标在同一个目录下时,mv 就执行重命名操作。
示例 1:重命名单个文件
# 将 'old_name.txt' 重命名为 'new_name.txt' mv old_name.txt new_name.txt
示例 2:重命名目录

# 将 'old_folder' 目录重命名为 'new_folder' mv old_folder new_folder
重要选项
掌握这些选项能让 mv 命令更安全、更强大。
-i (interactive) - 交互式
在覆盖文件之前,会提示用户确认。强烈推荐在 Shell 配置文件(如 .bashrc 或 .zshrc)中设置 alias mv='mv -i',这样可以防止意外覆盖重要文件。
# 如果目标文件 'report.txt' 已存在,会提示: # mv: overwrite 'report.txt'? (y/n) mv -i report.txt /home/user/documents/
-f (force) - 强制
即使目标文件已存在,也不提示,直接强制覆盖,这是 mv 的默认行为,但如果设置了 -i 别名,则需要用 -f 来覆盖别名。
# 直接覆盖目标文件,不会有任何提示 mv -f report.txt /home/user/documents/
-v (verbose) - 详细模式
显示 mv 命令执行了哪些操作,对于调试或理解命令执行过程非常有用。
# 会显示具体的移动操作 mv -v report.txt /home/user/documents/ # 输出: # 'report.txt' -> '/home/user/documents/report.txt' # 移动多个文件时,可以看到每个文件的操作 mv -v *.log /var/log/archive/
-n (no-clobber) - 不覆盖
如果目标文件已存在,则不覆盖,并且不提示,这是一个非常安全的选项。
# 如果目标文件已存在,命令会静默失败,不会覆盖 mv -n report.txt /home/user/documents/
--backup - 备份
在覆盖文件之前,先对目标文件进行备份,通常会与 --backup=TYPE 一起使用。
TYPE可以是 (默认,在文件名后加 )、numbered(数字编号,如.bak1,.bak2)、existing(如果已有备份则编号,否则加 )等。
# 覆盖前,将已存在的 'report.txt' 备份为 'report.txt~' mv --backup=~ report.txt /home/user/documents/ # 覆盖前,将已存在的 'report.txt' 备份为 'report.txt.~1~' mv --backup=numbered report.txt /home/user/documents/
高级用法与常见场景
使用通配符批量重命名
这是 mv 结合 Shell 通配符的一个强大技巧。
场景:将当前目录下所有 .JPG 文件(大写后缀)重命名为 .jpg(小写后缀)。
# 循环处理每个匹配的文件
for file in *.JPG; do
# 将 file 变量中的 .JPG 替换为 .jpg
mv "$file" "${file%.JPG}.jpg"
done
"$file":双引号确保文件名中的空格也能被正确处理。${file%.JPG}:这是 Shell 的参数扩展,意思是“移除变量file中从后匹配的第一个.JPG”。
移动并重命名
可以一步完成移动和重命名。
# 将 'source_file.txt' 移动到 '/home/user/' 目录,并重命名为 'destination.txt' mv source_file.txt /home/user/destination.txt
常见错误与注意事项
-
目标已存在是目录: 如果目标路径已经是一个目录,
mv会将源文件或目录移动到该目录内部。# 假设 'docs' 是一个目录 mv report.txt docs/ # 结果是: docs/report.txt
-
目标已存在是文件: 如果目标路径已经是一个文件,并且你没有使用
-i或-n选项,那么源文件的内容会覆盖目标文件的内容,且无法恢复(除非你有备份),这是最危险的操作之一! -
权限问题:
- 你需要对源文件/目录有读取和执行权限(如果是目录)。
- 你需要对源文件/目录所在的父目录有写入和执行权限。
- 你需要对目标目录有写入和执行权限。
- 你需要对目标文件有写入权限(如果目标已存在)。
-
跨文件系统移动:
mv命令在同一个文件系统内移动文件时,实际上是“重命名”文件的 inode,速度非常快,但如果跨文件系统移动(例如从/home移动到/mnt),mv会先cp(复制)文件,rm(删除)源文件,这会比较慢,且如果复制过程中断,可能会导致源文件被删除而目标文件不完整。
总结表格
| 命令 | 描述 | 示例 |
|---|---|---|
mv file1.txt dir/ |
移动文件到目录 | mv notes.txt ~/Documents/ |
mv old_name new_name |
重命名文件/目录 | mv config.php config.php.bak |
mv -i file1.txt file2.txt |
覆盖前提示(推荐) | mv -i report.txt report_final.txt |
mv -f file1.txt file2.txt |
强制覆盖,不提示 | mv -f temp.log main.log |
mv -v *.log /archive/ |
详细模式,显示操作 | mv -v *.log /var/log/archive/ |
mv -n file1.txt file2.txt |
如果目标存在,则不覆盖 | mv -n data.txt data_new.txt |
mv --backup=~ file1.txt file2.txt |
覆盖前备份(添加 ) | mv --backup=~ config.php config.php |
mv 是日常 Shell 操作中不可或缺的工具,理解它的核心功能和常用选项,特别是 -i,能极大地提高你在 Linux/Unix 环境下的工作效率和文件操作的安全性。
