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

cp

复制文件或目录,并决定是否保留 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

易错点与排错

相关命令

参考链接

读完自测

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

  1. cp -R src dst/ 与 cp -R src/ dst/ 在 dst 已存在时结果有何不同?
  2. -p 会保留哪些 macOS 特有信息?-X 又会去掉什么?
  3. 为什么 cp -c 有时没有真正克隆?
答案
  1. 前者得到 dst/src,后者把 src 的内容直接复制进 dst。
  2. -p 保留 ACL、扩展属性和资源分支等元数据;-X 不复制扩展属性和资源分支。
  3. -c 只在同一 APFS 卷且文件系统支持克隆时生效,否则静默退回普通复制。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令