系统学习 macOS 学习路径:从 BSD 文件命令到系统、网络与开发维护

mv

移动或重命名文件与目录,同卷原子改名,跨卷则复制后删除。

补充说明

mv 在同一文件系统内调用 rename(2),是原子的:目标要么是旧文件,要么是新文件,不会出现写了一半的状态。跨卷(例如从内置 APFS 卷移到外接 ExFAT 盘)时,mv 实际执行复制再删除源文件,耗时更长,中途中断可能留下不完整的目标文件和仍然存在的源文件。

BSD 与 GNU 的差异:macOS 支持 -h,当目标是“指向目录的符号链接”时不跟进去,而是替换链接本身;GNU 没有 -h,常用 -T 强制按普通目标处理。macOS 没有 GNU 的 -t(指定目标目录)和 -T,脚本迁移时要改写参数顺序。两者都支持 -n(不覆盖)、-i(覆盖前询问)和 -v(显示过程)。

mv dir 已存在目录 会把 dir 放到目标目录里面;mv file 已存在目录 同理。要真正改名成目标名,目标必须是尚不存在的路径。APFS 默认大小写不敏感,只改大小写(mv readme.md README.md)通常可以成功,但在大小写敏感的卷上会被当作两个不同文件。

常用示例

# 移动到目录,保留原文件名
% mv ~/Downloads/report.pdf ~/Documents/

# 重命名;目标不存在时才叫重命名,存在则是覆盖
% mv draft.md final.md

# 不覆盖目标目录中的同名文件,适合归档日志
% mv -n ~/Logs/*.log /Volumes/Archive/logs/

# 目标是符号链接目录时,替换链接本身而不是把文件放进去
% mv -h new.conf ~/config-link

# 显示每个被移动的路径,跨卷时能看出复制进度
% mv -v ~/Movies/old ~/Movies/archive-2026

# 跨卷移动前先确认空间足够,失败时源文件应仍在
% df -h /Volumes/Archive && mv ~/VMs/disk.img /Volumes/Archive/

易错点与排错

相关命令

参考链接

读完自测

合上页面,先回答,再展开对照。

  1. 同卷 mv 与跨卷 mv 在实现和失败风险上有什么区别?
  2. 当目标是“指向目录的符号链接”时,默认行为和 -h 有什么不同?
  3. 为什么 mv -n 跳过文件后脚本仍可能显示成功?
答案
  1. 同卷走 rename(2),原子完成;跨卷先复制再删除,中断可能留下不完整目标。
  2. 默认跟进链接目录,把文件移入其中;-h 不跟随,替换链接本身。
  3. 目标存在时 -n 静默跳过,命令本身没有出错,退出码可能仍为 0。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令