在Linux服务器间传输文件夹,最常用的命令是scp和rsync,其中rsync支持增量同步和断点续传,更适合大文件夹和频繁同步的场景。
Linux服务器间传文件夹,这些命令你必须掌握
无论你是运维新手还是老手,在两台Linux服务器之间搬运数据都是家常便饭,传文件夹看似简单,但选错方法可能让你等得心焦,甚至丢数据,下面我直接上干货,把主流方案摊开讲清楚。
scp:零学习成本的基础方案
scp(Secure Copy)基于SSH加密传输,语法和cp几乎一样,适合快速传小文件或一次性任务。
scp -r /本地文件夹 用户名@远程IP:/目标路径
-r参数递归拷贝整个目录。- 默认端口22,如果SSH端口换了,用
-P 端口号。 - 缺点:单线程传输,大文件慢;不支持断点续传;无法增量更新。
适用场景:临时传个几百MB的小包,或者对方服务器只有scp可用。
rsync:增量同步与断点续传的首选
rsync是Linux下最强大的文件同步工具,没有之一,它只传输变化的部分,网络中断后可以续传,还能压缩数据、限制带宽。
rsync -avz /本地文件夹 用户名@远程IP:/目标路径
-a归档模式,保留权限、时间戳等属性。-v显示进度。-z传输时压缩,节约带宽。-P保留部分传输的文件,实现断点续传,同时显示进度。- 首次传输和scp一样慢,但后续同步飞起。
适用场景:每天定时同步网站目录、备份数据库文件、迁移几十GB以上的数据。
tar配合ssh:打包传输的另一种思路
当文件夹里小文件特别多(比如PHP项目),直接用scp或rsync可能因为大量丢包而变慢,此时可以先用tar打包,再通过管道发送到远程解压。
tar czf - /本地文件夹 | ssh 用户名@远程IP "tar xzf - -C /目标路径"
-
流式打包,不占用本地磁盘。
- 压缩率可调,
-z是gzip,想更快换-j(bzip2)或-J(xz)。 - 适合文件数量上万、单个文件体积小的场景。
使用nc快速传输(不加密)
如果你在局域网内传文件,且不担心被监听,nc(netcat)是速度最快的方案,它没有加密开销,理论能跑满带宽。
接收端先开监听:
nc -l 端口号 | tar xzf -
发送端传输:
tar czf - /本地文件夹 | nc 接收端IP 端口号
注意:nc没有加密,千万别在公网用,另外要确保防火墙放行对应端口。
scp和rsync哪个更适合你的场景
很多人在第一次选工具时都会纠结,我直接告诉你,多数情况下rsync优于scp,但也不是绝对。
传输速度对比
- 单次传输大文件:scp早期版本可能略快,但现代rsync启用压缩后差距不大,如果文件已存在,rsync只传增量,速度碾压。
- 大量小文件:rsync比scp稳定,因为scp单线程容易丢包,而rsync通过分块校验可以应对。
- 网络不稳定:rsync支持断点续传,scp断了只能重来。
安全性对比
两者都基于SSH隧道,加密强度相同,但如果你用nc传,那就不加密了。安全第一的原则下,内网用nc,公网必须用scp或rsync。
断点续传与增量传输
这是rsync的核心优势。--partial 参数让rsync保留已传部分,下次继续,scp没有这个能力,对于定时同步任务,比如每天凌晨备份,rsync结合cron是实现linux跨服务器同步文件夹命令的最佳实践。
Linux服务器之间快速传输大量文件的实用技巧
当你面对几十GB甚至上百GB的文件夹时,光靠基础命令不够,得用点巧劲。
压缩传输的最佳实践
网络带宽通常是瓶颈,压缩能减少传输量,但会消耗CPU,需要平衡。
- 使用rsync的
-z参数,它会自动压缩,但不一定会压缩整个文件,只是分块。 - 手动压缩再传:tar打包后,用scp或rsync传压缩包,这样压缩率更高,但需要额外磁盘空间和打包时间。
建议: CPU不强且网络带宽充足,不压缩;CPU够强、网络慢,用 -z 或 -J 高压缩比。
限制带宽,避免影响其他服务
共享带宽的服务器上,传文件可能把带宽占满,导致业务响应慢,rsync允许你限速。
rsync -avz --bwlimit=10M /本地文件夹 用户名@远程IP:/目标路径
--bwlimit 单位是KB/s,例子中 10M 代表10MB/s,根据你的带宽合理设置。
使用nohup或screen后台传输
传大文件通常要等很久,如果SSH连接断开,任务就中断了,用nohup把命令丢到后台。
nohup rsync -avz /本地文件夹 用户名@远程IP:/目标路径 > rsync.log 2>&1 &
或者用screen/tmux,它们更灵活,可以随时连回来查看进度,这是解决linux服务器传输文件夹速度慢问题的常见配套方案,因为你可以让传输在后台跑,不影响你继续敲命令。
多线程加速(快速传输大量文件)
scp和rsync默认单线程,如果你有多个文件,可以并行传输。
- 使用
xargs或parallel拆分文件列表,同时跑多个rsync进程。 - 或者直接用
fpsync(包含在Fpart工具集里),它能将文件列表分片并用多进程同步。
注意:并行会消耗更多CPU和网络带宽,不要盲目开太多线程,通常2-4个就够。
传输后如何验证文件夹完整性
文件传完不等于万事大吉,尤其是重要数据,必须确认没有丢包或损坏。
使用md5sum或sha256sum
先在本机计算所有文件的校验和清单,再在远程机器上计算一遍,比对结果。
# 本地生成校验文件
find /本地文件夹 -type f -exec md5sum {} ; > local.md5
# 把校验文件传到远程
scp local.md5 用户名@远程IP:/目标路径
# 远程执行校验
md5sum -c local.md5
如果输出全是 OK,说明文件完整,这个过程比较耗时,但可靠。
使用rsync自带的校验
rsync传输时默认使用弱校验(快速),可以用 --checksum 强制要求文件校验和,但这样会大幅降低速度,因为要读取整个文件。通常不推荐开启,除非数据敏感度极高。
更实用的做法是:传输完成后,用 rsync -avc --delete 再跑一次空同步,如果没有任何输出,说明文件已一致。
Linux传文件夹常见问题解答
问:scp和rsync可以同时使用吗?
这两个命令完全独立,但一般不需要同时用,如果你喜欢scp的简单,又想要断点续传,可以试试 rsync -e ssh,它强制rsync使用SSH作为传输通道,行为和scp类似但多出rsync的特性,rsync默认就是走SSH,所以日常用rsync就够了。
问:为什么rsync传输速度比我想象中慢?
多数情况下是因为网络延迟或小文件过多,检查一下是否开启了压缩,如果CPU压力不大,加上 -z。--progress 参数会频繁打印进度,也会消耗CPU,可以去掉,如果文件数量超过10万,建议先用 tar 打包再传,避免rsync建文件列表时卡住。
问:如何实现两台服务器之间的定时同步文件夹?
在源服务器上编辑crontab,添加一条rsync命令,例如每天凌晨2点同步:
0 2 /usr/bin/rsync -avz --delete /本地文件夹 用户名@远程IP:/目标路径 >> /var/log/rsync.log 2>&1
--delete 参数会让远程删除本地没有的文件,达到完全镜像,注意第一次手动跑一下,确保权限和路径正确。
传文件夹没有银弹,小文件用scp,大文件或同步用rsync,局域网内图快用nc,文件多且小就打包再传,记住把安全放在首位,公网传输一定要加密,内网可以适当牺牲加密换速度,选择最适合你网络环境和文件特征的方案,比盲目套用命令更高效。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/585028.html




