开篇直接给答案
在Linux服务器上下载文件夹,最直接、最通用的方案是用scp -r命令,它基于SSH协议,一条命令就能把整个目录树从服务器拉到本地。 无论你是从本地连接服务器,还是在两台服务器之间搬运数据,这个命令都适用,下面按不同场景给你拆解具体操作。
从本地下载:用scp -r拉取整个目录
这是最典型的场景,你的电脑上打开终端,想要把服务器上某个项目目录或日志文件夹下载到本地,核心命令格式如下:
scp -r 用户名@服务器IP:服务器上的绝对路径 /本地保存路径/
看起来抽象,我举个具体例子,当前服务器IP是168.1.100,用户名是root,服务器上有个文件夹在/data/www/mysite,你想下载到本地当前目录下的backup文件夹里:
scp -r root@192.168.1.100:/data/www/mysite ./backup/
执行后系统会提示输入密码,输完回车就开始传输。-r参数是关键,少了它scp会报错,因为它默认只能传文件,不能递归处理文件夹。
下载到本地时注意这几点
- 路径中的(波浪号)会被识别为主目录,比如
scp -r root@IP:~/www /local/可以正常使用。 - 如果服务器SSH端口不是默认的22,需要加
-P参数指定端口号,注意是大写P,例如scp -r -P 2222 root@IP:/data /local/。 - 下载大文件夹时建议在命令前加
nohup,避免终端断开导致传输中断,比如nohup scp -r root@IP:/data /local/ &。 - 本地路径必须存在,否则命令会报“No such file or directory”。
服务器之间传输文件夹:scp反向操作和第三方中转
有时候你在两台服务器之间搬运数据,比如把A服务器的网站目录迁移到B服务器,这个场景有两种常见做法。
在一台服务器上直接操作
登录到B服务器,执行拉取命令,把A服务器的文件夹拉过来:
scp -r root@A服务器IP:/data/www /data/www_bak
这种方式的好处是操作简单,适合一次性迁移,但如果A服务器的带宽有限,传输速度会偏慢,而且受制于两台服务器之间的网络链路质量。
通过本地电脑中转
先把文件夹从A服务器下载到本地,再上传到B服务器:
# 第一步:A服务器下载到本地 scp -r root@A服务器IP:/data/www /local/temp/ # 第二步:本地上传到B服务器 scp -r /local/temp/www root@B服务器IP:/data/
这种方式的缺点是经过两次网络传输,耗时翻倍,只推荐在无法直接连通两台服务器(比如内网隔离)的情况下使用。
不想敲命令?用这些替代方案更方便
不是所有人都喜欢在终端里敲命令,尤其是文件夹特别大,或者你只在偶尔需要下载时不想记参数。
tar打包后下载单个文件
先压缩再传输,能显著减少传输时间,尤其是网站目录、图片文件夹这类包含大量小文件的情况,在服务器上执行:
tar -czvf mysite.tar.gz /data/www/mysite
然后本地用scp下载这个压缩包:
scp root@IP:/data/www/mysite.tar.gz ./
下载完在本地解压:
tar -xzvf mysite.tar.gz
这个方法有个额外好处:打包后的文件可以完整保留文件夹的权限属主和时间戳,还原后目录结构完全一致。行业共识认为,在传输包含大量小文件(比如静态资源、图片素材)的目录时,先打包再传输的效率比直接scp传输高出一截。
rsync断点续传
文件夹特别大,比如几个GB的数据库备份或者视频素材,传输中途断了就要从头再来,这是用scp最大的痛点,rsync支持断点续传和增量同步:
rsync -avz --progress root@IP:/data/www/mysite /local/backup/
参数说明:
-a归档模式,保留权限、时间戳等信息-v显示详细输出-z传输时压缩--progress显示传输进度
rsync还有个好处:本地已经有的文件不会重复传输,二次同步时速度极快。做定期备份的场景下,它是比scp更合适的选择。
lrzsz工具的sz命令(适合小文件)
如果你是通过Xshell、SecureCRT这类终端软件连接服务器的,可以用lrzsz的sz命令直接弹窗保存文件到本地:
sz /data/www/mysite.tar.gz
执行后终端会弹出让你选择保存位置的窗口,但这个命令只支持传单个文件,不支持文件夹,所以使用前必须先打包,适合传几MB到几十MB的小文件,大文件会非常慢,没进度条,而且容易卡死会话。
常见下载场景实测对比
不同场景下选哪个方案最省事?给你一个直观的对比:
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 一次性下载小文件夹(几十MB以内) | scp -r | 命令最简单,无额外操作 |
| 下载大文件夹(1GB以上) | tar打包 + rsync | 压缩减少传输量,断点续传防止中断 |
| 定期做本地备份 | rsync | 增量同步,资源开销小 |
| 服务器之间迁移站点 | scp -r 直接拉取 | 一次完成,避免中转 |
| 终端里快速传几十MB的小文件 | sz命令 | 弹窗保存,无需手打路径 |
| 图形化操作,含拖拽下载 | WinSCP / FinalShell | 拖拽即可,适合新手 |
linux服务器下载文件夹到windows的特别说明
如果你在Windows上操作,最直观的方式是用WinSCP这类图形化SFTP工具。下载整个文件夹的路径是:打开WinSCP,输入服务器IP、用户名和密码连接,右侧是服务器目录,左侧是本地目录,直接选中右侧的文件夹拖拽到左侧即可。整个文件夹会完整复制到本地。
也可以用Windows自带的命令提示符或PowerShell执行scp命令,Win10以上系统自带了这个功能:
scp -r root@IP:/data/www/mysite D:\backup\
注意Windows的路径写法用盘符加反斜杠,D:\backup\这个文件夹需要提前创建好。
报错排查:下载文件夹时常见的三个坑
Permission denied(权限被拒绝)
一般有两种原因:密码输错,或者当前用户没有访问目标文件夹的权限,解决思路是检查目标文件夹的权限设置:
# 在服务器上执行,查看文件夹权限 ls -ld /data/www/mysite
如果当前用户不是属主且没有读权限,要么切到有权限的用户,要么用chmod或chown调整。
No such file or directory(目录不存在)
绝大多数情况是路径写错了,或者拼写大小写有误。Linux路径区分大小写,/data/www和/data/WWW是两个完全不同的路径,先在服务器上用ls确认路径存在,再复制粘贴到scp命令中。
Connection timed out(连接超时)
检查服务器的防火墙规则,确认SSH端口是否对本地IP开放,如果是简米云或酷番云的服务器,还要检查安全组策略。
怎么选:速度优先还是稳定优先
大多数情况下,scp -r和rsync在带宽充足时速度差异不大,真正的瓶颈在网络链路。如果你上传到服务器的带宽本来就只有1MB/s,用什么工具都跑不上更快的速度。
小技巧:服务器上打包时可以用tar -I调用多线程压缩工具pigz,能明显加快压缩速度:
tar --use-compress-program=pigz -czvf mysite.tar.gz /data/www/mysite
对带宽充足但CPU资源紧张的服务器,也可以先打包不压缩,直接传原始包,减少CPU负载。
业内专家指出,实际生产环境中遇到下载文件夹最棘手的问题往往不是命令本身,而是网络不稳定导致的中断和文件夹体积超出预期,建议在动手之前用du -sh看一下文件夹大小,决定是用scp直接传还是打包后传。
Q&A:关于linux服务器下载文件夹的常见疑问
Q1:scp和rsync到底选哪个?
如果是一次性操作、文件夹不大、网络稳定,选scp,命令短,心智负担低,如果是重复备份、文件夹巨大或网络不稳定,选rsync,它支持断点续传和增量同步,传输一半断了可以接着传,scp则只能从头再来。
Q2:目标文件夹包含符号链接或软链接,直接下载会不会出错?
scp -r默认会展开符号链接指向的实际文件内容,导致打包下载的文件超出预期大小,如果希望保留链接本身,建议在服务器上先执行tar -czh,-h参数让tar跟随符号链接打包实际文件,或者用cp -rL复制真实文件后再传输,避免本地出现失效的软链接。
Q3:下载一个几十GB的文件夹,为什么scp命令显示传输完成后本地文件大小对不上?
最常见的原因是服务器上文件夹内的文件在传输过程中发生变化,比如日志文件在持续写入,造成前后不一致,另一个原因是分卷传输时遇到符号链接或稀疏文件,scp会因为文件内容变化而中断复制,导致静默失败,建议传输前先停掉相关应用服务,或者用rsync做两轮同步,第一轮传输文件,第二轮补充差异,确保目录结构完全一致。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/786599.html


