使用 cp 命令保留元数据需用 -p(保留权限、所有权、时间戳)或 -a(归档模式,等价于 -dr --preserve=all,还保留符号链接、硬链接、扩展属性等);复制目录必须用 -r 或 -a,符号链接需 -d 或 -a 才不展开。

用 cp 命令复制文件或目录时,要保持源文件的元数据(如权限、所有者、时间戳、符号链接等)不变,关键在于选用正确的选项,而不是依赖默认行为——普通 cp 会重置时间戳、忽略所有权、展开符号链接。
核心选项:-p 和 -a
-p 是保留基础元数据的最常用选项,它等价于 --preserve=mode,ownership,timestamps,即保留:
- 文件权限(mode)
- 所有者与所属组(ownership)
- 访问时间、修改时间、状态变更时间(timestamps)
适用于单个文件或少量文件:cp -p file.txt /backup/
-a(archive 模式)是更彻底的选择,等价于 -dR --preserve=all,除 -p 的全部内容外,还额外保留:
- 符号链接本身(不跟随链接目标)
- 硬链接关系
- 扩展属性(xattr)、ACL(若系统支持)
- 递归处理目录结构
这是完整镜像目录的推荐方式:cp -a /etc/nginx/ /backup/nginx/
精细控制:--preserve=
如果只需保留部分属性,可显式指定,例如:
- 只保留权限和时间戳:
cp --preserve=mode,timestamps src dest - 只保留所有者和组:
cp --preserve=ownership src dest - 保留全部但排除 ACL:
cp --preserve=all,--no-preserve=xattr src dest
注意符号链接与目录的特殊处理
默认 cp 会复制符号链接指向的文件内容,而非链接本身。若需保留链接结构:
- 用
-a或-d(同--no-dereference):链接原样复制 - 复制目录必须加
-r或-a;单独用-p复制目录会报错 - 隐藏文件(如
.bashrc)会被-a自动包含,无需额外通配
替代方案:rsync 与 tar
对跨主机或需校验的场景,可考虑:
-
rsync -a /src/ /dst/:-a 含义与 cp -a 一致,支持增量、远程同步 -
tar -cf - . | (cd /dst && tar -xf -):管道归档天然保留全部属性 -
tar --preserve-permissions -cf archive.tar files:显式要求权限保留











