复制文件或目录,并决定是否保留 macOS 的 ACL、扩展属性与资源分支。
macOS 的 cp 来自 BSD,基础行为与 Linux 相同,但元数据处理是重点:-p 会保留修改时间、访问时间、文件标志、权限、属主和属组,以及 ACL、扩展属性和资源分支;-X 则明确不复制扩展属性和资源分支。-R 递归复制,-a 等价于 -RpP,-c 使用 APFS 的 clonefile(2) 做写时复制,速度快且不额外占空间。
GNU 差异:macOS 的 cp 没有 -t、--parents、--reflink、--preserve=;对应的能力分别是 -c(克隆)、-a(归档)和 -p/-X。macOS 还支持 -n(不覆盖已有文件)和 -S(不保留稀疏文件空洞)。
源目录末尾有没有 / 会改变结果:目标目录已存在时,cp -R src dst/ 得到 dst/src,cp -R src/ dst/ 则把 src 的内容直接铺进 dst。跨文件系统复制到 FAT、ExFAT 或 SMB 时,扩展属性和资源分支可能变成 ._ 开头的 AppleDouble 文件。
# 保留时间、权限、ACL 和扩展属性,适合备份配置
% cp -p ~/Documents/report.pdf ~/Backup/
# 递归复制目录;注意源目录末尾没有斜杠,会复制整个 src 目录
% cp -R ~/Projects/src ~/Backup/src-$(date +%F)
# APFS 同卷克隆大文件,几乎瞬时且初始不占额外空间
% cp -c ~/VMs/disk.img /Volumes/Fast/disk.img
# 去掉 quarantine 等扩展属性后再打包,避免把来源标记带进发布物
% cp -X ~/Downloads/app.zip ./clean/app.zip
# 不覆盖已有文件,适合把新文件合并进目录
% cp -n ~/notes/*.md ~/Archive/notes/
# 跨卷复制并显示过程;资源分支可能被转成 AppleDouble
% cp -Rv /Volumes/USB/photos ~/Pictures/import
cp -p 以普通用户运行时无法保留不属于自己的属主和属组,但不会报错,退出码也可能仍是 0。需要保留所有权时用 sudo cp -p,并在复制后用 ls -l 核对。cp 默认直接覆盖,且不像 mv 那样有 -n 提示。批量覆盖前先用 cp -n 或先 ls 目标,重要数据先做 Time Machine 备份。/ 会改变复制层级,脚本里最容易在这里多出一层或少一层。复制后用 find 目标 -maxdepth 2 核对结构。-c 只在同一 APFS 卷、且目标文件系统支持克隆时生效,否则自动退回普通复制,不会报错。想确认是否克隆,用 ls -l 看大小或比较磁盘可用空间。._文件名,这是 AppleDouble 元数据文件,不是病毒;要避免就用 -X 或先打包成 tar/zip。Text file busy 或让进程继续用旧 inode;部署二进制应写到临时文件再 mv 原子替换。mv — 移动或重命名,跨卷时内部也是复制后删除。rm — 删除复制产生的临时文件。xattr — 检查复制后保留或丢失的扩展属性。cp — GNU 版对照,注意长选项差异。copy — Windows CMD 的复制命令。合上页面,先回答,再展开对照。
cp -R src dst/ 与 cp -R src/ dst/ 在 dst 已存在时结果有何不同?-p 会保留哪些 macOS 特有信息?-X 又会去掉什么?cp -c 有时没有真正克隆?dst/src,后者把 src 的内容直接复制进 dst。-p 保留 ACL、扩展属性和资源分支等元数据;-X 不复制扩展属性和资源分支。-c 只在同一 APFS 卷且文件系统支持克隆时生效,否则静默退回普通复制。
小程序版
微信扫码,随时查命令