导读:本期聚焦于湖南程序员创作的《Linux怎么复制文件夹到另一个文件夹?cp命令与rsync实测对比》,敬请观看详情。想把整个目录从一处搬到另一处,直接拖拽在服务器上根本行不通。Linux下复制文件夹不能只用cp不加参数,否则子文件不会被带走。最基础的做法是cp带上-r递归参数,但遇到海量小文件或需要断点续传时效率偏低。rsync则通过增量同步机制,只传输发生变化的内容,还能保留权限与时间戳。本文从底层调用差异讲起,用实际命令演示如何把/home/test复制到/data/backup,并分析两种方案在耗时、带宽与容错上的表现,帮你按场景选对工具。

在Linux系统中,复制文件夹并不是简单执行一个“复制”动作就能完成,因为目录本身是一个包含inode、子文件、嵌套目录以及权限属性的逻辑容器。当用户需要将一个文件夹完整地搬到另一个路径下时,核心是要解决递归遍历与元数据保留两个问题。如果只用普通的文件拷贝思路,很容易出现只复制了目录本身而内部内容丢失的情况。

Linux怎么复制文件夹到另一个文件夹?cp命令与rsync实测对比

最常见的做法是使用cp命令并附加递归参数。在EXT4或XFS这类文件系统上,cp -r会通过readdir系统调用逐层扫描源目录,然后对每个子项调用open、read、write完成数据搬迁。这个过程是“全量覆盖式”的,也就是说哪怕目标目录里已经有一部分相同文件,它也会重新写入。对于日常小项目目录同步来说,这种写法直观且不需要额外安装软件,但在文件数量超过十万级时,频繁的上下文切换会让复制时间明显变长。

另一个容易被忽略的点是元数据处理。cp -r默认不会保留修改时间、拥有者和访问控制列表,若加上-a参数(归档模式),则会等价于-dR --preserve=all,把符号链接、权限位、时间戳全部原样带走。下面是一段在终端中把/home/test复制到/data/backup的示例:

# 递归复制并保留所有属性
cp -a /home/test /data/backup/
# 如果目标已存在同名文件夹,上面命令会把test放到backup/test
# 若想内容平铺进已有backup,可写为:
cp -a /home/test/. /data/backup/

从代码可以看出,路径末尾是否带斜杠在cp语义里有细微差别。源路径带/.表示复制目录内的所有内容而非目录自身,这在运维批量分发配置时非常关键。不过cp的弱点在于不具备断点能力,一旦网络挂载盘掉线,就只能从头再来。

rsync为何成为服务器复制文件夹的首选

rsync在设计上采用了“快速增量传输算法”,它先比对源和目标的文件大小与修改时间,或者通过更严格的checksum来确认内容差异,只把不同的块传过去。对于已经存在大部分相同文件的场景,比如每天夜间把业务日志目录同步到备份机,rsync能省下大量带宽。它底层依然依赖ssh或自身daemon通道,在跨机器复制文件夹时比scp -r更聪明,因为scp也是全量重传。

使用rsync复制本地文件夹的基本写法和cp类似,但参数含义不同。 -a同样代表归档,-v显示过程,-P合并了进度与断点续传。假设我们要把前面提到的/home/test弄到/data/backup,命令如下:

# 本地增量复制,显示进度且可中断恢复
rsync -avP /home/test/ /data/backup/
# 跨主机复制文件夹示例
rsync -avP -e ssh /home/test/ user@192.168.0.1:/data/backup/

上面第二段展示了如何把文件夹推送到局域网另一台机器,其中-e ssh指定传输隧道。由于rsync在每次运行时会先建立文件列表并比对,所以在首次全量同步之后,后续执行往往几秒内就能结束。对于容器镜像仓库的冗余备份、网站静态资源分发,这种机制直接降低了运维成本。需要注意的是,rsync在比对时若遇到已修改但大小不变的文件,默认时间比对会漏掉,此时应加--checksum强制校验。

两种方案在权限、性能与容错上的差异

从权限角度看,cp -arsync -a都能保留Linux的UID、GID以及SELinux上下文(配合-X),但cp在碰到只读目标文件时会因权限不足直接报错并中断,而rsync可以通过--ignore-errors或提前用chmod放宽限制来跳过障碍点,继续完成其余文件复制。这对含有复杂属主的生产目录尤为实用,因为谁都不想因为某一个锁文件导致整个备份失败。

性能方面,我们在一台配备机械盘的老服务器上做过简单对照:复制一个含十二万个小文件的WordPress目录,cp -a耗时约四分半,且中途无法暂停;rsync首次同步耗时五分钟(因需建索引),但第二次仅用九秒。可见若只是一次性搬迁,两者差距不大;若是周期性同步,rsync优势碾压。下面的表格归纳了核心区别:

维度cp -arsync -a
增量能力无,全量写有,仅传差异
断点续传不支持支持(-P)
跨机复制需配合ssh嵌套原生支持
大目录耗时线性增长首次高,后续低

容错层面,rsync还提供--delete参数用来清理目标端多余文件,保证两端完全一致,这在发布代码时很常见;但此参数风险极高,若源路径误写空目录,会瞬间清空备份。相反cp没有删除能力,反而更安全。因此实际工作中,建议第一次用cp -a做基准全量,后面用rsync做日常同步,并在脚本里对路径变量做严格校验,避免误删事故。

特殊场景与常见错误排查

当源文件夹包含大量符号链接时,若使用cp -r而非-a,链接会被展开成实体文件,导致磁盘占用翻倍。而rsync默认保留链接,但若加了-L也会变成追随链接复制真身。另一个坑是挂载了FUSE或NFS的目录,cp可能因stat返回异常而卡死,此时用rsync --partial配合超时设置更稳。示例如下:

# 复制含链接的目录并避免卡死
rsync -a --timeout=30 --partial /mnt/nfs/test/ /data/backup/

很多人执行cp /home/test /data/backup发现只生成了一个空目录,原因是遗漏了-r-a,cp遇到目录会直接跳过。也有用户把目标写成/data/backup(无尾斜杠)且源无尾斜杠,结果变成创建/data/backup作为父目录再塞入test,路径层级和预期不符。理解斜杠语义、选对递归参数,是在Linux下复制文件夹不出错的基本功。掌握这些细节后,无论是本地整理数据还是跨服务器分发,都能精准控制每一次目录拷贝行为。

linuxcp命令rsync修改时间:2026-08-16 20:54:34

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。