不夸张地说,cp、scp、rsync这三个命令,是我在协助团队排查服务器问题时被问得最多的三兄弟。很多人习惯了"cp本地复制、scp远程复制、rsync同步备份"这个粗糙印象,可真到了生产环境里,一个cp -a能不能保留ACL、一个scp端口写错连不上、一个rsync因为路径末尾少了斜杠把目录结构同步得乱七八糟,这些细节才是真正让人头疼的地方。这篇东西我打算把这几年实际踩过的坑、看过的文档、写过的同步脚本一次性梳理清楚,给那些已经在用这几个命令、但还没完全吃透它们脾气的人一份可以直接抄作业的参考。
1. 先搞明白三兄弟的分工:本地、远程、增量同步是三条完全不同的路
很多新人会把cp、scp、rsync当成同一类工具的不同版本,这个理解大方向没错,但它们解决的问题其实完全不同。cp是纯本地操作,只能在同一台机器的文件系统里做复制,它的核心任务是"把文件从这个路径复制到那个路径",不涉及网络,也不关心目标端是否已经存在相同内容。scp的本质是"用SSH封装的远程复制",它把本地文件通过加密通道推送到远程主机,或者从远程主机拉取到本地,适合偶尔传几个文件、不做复杂校验的场景。而rsync是个"同步专家",它不只复制,还会对比源和目标两边的文件差异,只传输变化的部分,既能本地同步,也能通过SSH或daemon模式做远程同步,是增量备份和镜像部署的标配工具。
打个比方:cp就像你把一本书从书桌这头搬到书桌那头,页面一字不差,但如果另一头已经放了一本一模一样的书,它不会管,照搬不误;scp像是你拿着书骑自行车送到隔壁小区,速度快但每次都是整本整本地送,哪怕对方已经有了同一本书也会再送一遍;rsync则像个聪明快递员,先看一眼对方家里缺哪几页,只补那几页。这个底层逻辑差异,决定了你在不同场景下该选谁。
还需要注意,scp和rsync虽然都能走SSH,但它们的传输协议和断点续传能力完全不一样。scp是古老的RCP协议升级版,只负责"把文件流从A搬到B",一旦传输中断,之前传了一半的文件直接作废,下次必须从头再来。rsync自己有一套校验和算法,支持--partial保留部分文件,下次同步时直接从断点继续。对于动不动几个GB的数据库备份文件,这个差异就是天壤之别。
明白了这个定位,后面所有参数和坑都好理解了。接下来我按命令一个一个拆,把我在生产环境里真正用过的参数、踩过的坑写出来。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. cp命令:别以为只是"复制",这些参数才是区分老手的标尺
cp看起来是所有命令里最没技术含量的,但凡是处理过大型目录迁移、文件属性异常、磁盘空间告急的人,都会对cp的几个隐藏参数记忆犹新。
2.1 保留一切的 -a 和容易搞混的 -d、-p、-R
我见过很多人的备份脚本里写着cp -r /data /backup,这个写法在绝大多数场景下是错的。-r只做递归复制,不保留文件权限、时间戳、属主和软链接结构。比如你复制一个带软链接的目录,用-r会把软链接指向的目标文件实打实复制一份,而不是保留软链接本身,恢复备份时整个目录结构就废了。
正确做法是cp -a。-a等于-dR --preserve=all,它做的事是:递归复制、保留软链接本身、保留权限、保留时间戳、保留属主属组、保留ACL和SELinux上下文。我建议把cp -a当成默认选项,除非你明确知道不需要保留任何元数据。它唯一的问题是复制大目录时速度不见得比-r快,因为要处理的属性多,但这点开销换来的可靠性值回票价。
还有个容易混淆的点:cp -p只保留权限和时间戳,cp -d只保留软链接而不跟随目标,cp -R跟-r行为几乎一样,只是对特殊文件的处理上略有差异。如果你不确定,直接cp -a,别纠结。
2.2 使用硬链接复制来省空间的 -l 和 --reflink
先看-l:它不复制内容,而是为文件创建硬链接。什么意思?目标文件不是一个副本,而是与源文件指向同一个inode,两边任意一边修改,另一边也会变。适合做"快照式"副本的场景:比如你有10个目录需要共享同一份只读资源,用cp -l可以瞬间完成,且几乎不占额外磁盘。但千万记住,硬链接不能跨文件系统,目录也不能硬链接,所以cp -l只适用于同一分区内的文件。
还有一个更现代的参数--reflink=auto,这是Btrfs、XFS等CoW文件系统上的黑科技。它在复制时生成一个"写时复制"的引用副本,复制操作瞬间完成,只
