移动或重命名文件与目录,同卷原子改名,跨卷则复制后删除。
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/
mv 默认无提示覆盖,且覆盖后旧文件无法找回。批量操作前用 mv -n 或 mv -i,重要目录先做 Time Machine 备份。mv -n 在目标存在时静默跳过,退出码仍可能是 0;脚本要逐个核对结果,不能只看退出码。cp -p 复制并校验,再删除源文件。-h。事后用 ls -l 检查链接是否还在。lsof | grep 文件名 验证。/System)即使 sudo 也会报 Operation not permitted,不要试图用 mv 绕过。cp — 跨卷移动前可先复制并校验。rm — 删除移动后遗留的源文件。ln — 创建链接,避免复制大文件。mv — GNU 版对照,注意 -t/-T。move — Windows CMD 的移动命令。合上页面,先回答,再展开对照。
mv 与跨卷 mv 在实现和失败风险上有什么区别?-h 有什么不同?mv -n 跳过文件后脚本仍可能显示成功?rename(2),原子完成;跨卷先复制再删除,中断可能留下不完整目标。-h 不跟随,替换链接本身。-n 静默跳过,命令本身没有出错,退出码可能仍为 0。
小程序版
微信扫码,随时查命令