| 工具 | 类型 | 平台 | 批量下载核心能力 | 适合场景 |
|---|---|---|---|---|
| lftp | 命令行 | Linux / macOS / Windows(WSL) | mirror镜像同步、pget多线程、队列管理、断点续传 | 服务器端大批量下载,最佳选择 |
| aria2 | 命令行 | 全平台 | 多线程分段下载,一个文件拆成N段并行拉 | 少量大文件极速下载 |
| wget | 命令行 | 全平台 | 递归下载、通配符匹配、断点续传 | 简单递归下载,不追求极致速度 |
| FileZilla | 图形界面 | Windows / macOS / Linux | 拖拽式、站点管理器、队列、断点续传 | 偶尔手动下载,非大批量场景 |
| WinSCP | 图形界面+脚本 | Windows | 同步目录、脚本自动化、定时任务 | Windows环境需要GUI+脚本双模式 |
| Shell脚本+crontab | 自动化脚本 | Linux | 全自动定时下载,零人工干预 | 每日/每周定期从FTP拉数据 |
一、lftp:命令行批量下载的天花板
如果只推荐一个FTP批量下载工具,就是lftp。它支持FTP、FTPS、SFTP、HTTP多种协议,核心优势是mirror镜像模式和pget多线程下载。场景一:整个目录镜像下载(最常用)
把远程FTP上整个 /backup/2026/ 目录同步到本地,只下载本地没有的文件(增量下载):
lftp -u username,password ftp.example.com -e "mirror --verbose --parallel=5 /backup/2026/ /local/backup/2026/; quit"
--parallel=5 表示同时开5个文件并发下载。mirror默认就是增量模式,只下载远程有但本地没有、或者远程更新的文件。第一次跑是全量下载,之后每次只拉增量,效率极高。
场景二:按规则过滤,只下载特定类型文件
只要.sql和.tar.gz文件,不要其他:
lftp -u user,pass ftp.example.com -e "mirror --include='.*\.sql$' --include='.*\.tar\.gz$' --exclude='.*' --parallel=5 /remote/ /local/; quit"

--include 和 --exclude 支持正则表达式。还有 --only-newer 只下载比本地新的文件,--delete 删除本地多余文件(和远程完全同步),--ignore-time 不比较时间直接全量覆盖。
场景三:大文件分段下载(单文件加速)
一个50G的数据库备份文件,单线程下载可能被FTP服务器限速。lftp的pget命令把一个文件切成N段同时下载:
lftp -u user,pass ftp.example.com -e "pget -n 10 /backup/db_dump.sql.gz -o /local/db_dump.sql.gz; quit"
-n 10 表示分成10段同时下载,对HTTP/FTP服务器限速有奇效。但注意有些FTP服务器不支持断点续传(REST命令),pget会失效。
lftp容易踩的坑:密码直接写命令行会被ps aux看到,生产环境建议把密码写到~/.lftprc配置文件里(权限设为600),或者用lftp -e "set ftp:passive-mode on" 加交互式登录。另外mirror时如果远程目录有几百万个小文件,建议把 --parallel 调到3-5而不是10,因为并发太高FTP服务器可能触发连接数限制导致封IP。
二、aria2:单文件极速下载,但不适合海量小文件
aria2的强项是把一个大文件切成N段,从同一个FTP服务器并行下载不同片段。一个10G的ISO镜像,aria2开16个线程能跑满千兆带宽。下载单个大文件
aria2c -x 16 -s 16 --ftp-user=username --ftp-passwd=password ftp://ftp.example.com/bigfile.iso
-x 16 是最大连接数,-s 16 是分段数。分段越多单文件越快,但连接数太多可能被服务器限流。一般设8-16就够了。
批量下载多个文件
把所有FTP文件URL写到一个文本文件里,一行一个:
aria2c -i urls.txt -j 5 --ftp-user=user --ftp-passwd=pass
-j 5 表示同时下载5个文件。但aria2不像lftp那样支持递归目录和通配符匹配,你需要先自己把FTP目录里的文件列表导出成URL清单。所以aria2适合"已知具体文件列表"的批量下载,不适合"把整个目录拉下来"的场景。
三、wget:简单粗暴的递归下载
wget最大的优势是几乎所有Linux发行版都预装了,不需要额外安装任何东西。递归下载整个FTP目录:
wget -r -np -nH --cut-dirs=2 --ftp-user=username --ftp-password=password ftp://ftp.example.com/backup/2026/
-r 递归下载,-np 不回溯父目录,-nH 不创建主机名目录,--cut-dirs=2 跳过前两级目录。断点续传加 -c 参数,只下载比本地新的加 -N 参数。
wget的局限在于它是单线程的,文件再多也是一个一个下。而且递归下载时如果目录层级很深,wget会先生成完整的文件列表再开始下载,目录特别大时内存占用会很高。海量小文件场景下wget比lftp慢3-5倍,大文件场景下比aria2慢5-10倍。但在"需要快速验证某个FTP能连上、能下载"这种临时场景,wget最方便。

四、图形界面工具:FileZilla和WinSCP能批量下载到什么程度
FileZilla:日常手动操作首选,批量下载有上限
FileZilla的批量下载就是"Ctrl+A全选目录里的文件,拖到本地窗口"。它能断点续传、能管理队列、能限速,但并发线程数最多10个(设置→传输→并发传输数),而且不支持正则过滤。对于几百个文件的手动下载够用,但几千几万个文件的自动化批量下载,FileZilla会频繁断开重连、丢队列、占满内存。
WinSCP:Windows平台最好的图形+脚本双模式
WinSCP的优势在于它既能当图形界面用,又能生成脚本文件给命令行跑。在WinSCP里配置好连接,选"会话→生成会话URL/代码→脚本文件",就得到一个.winscp脚本。然后用命令行调用:
winscp.com /script=download_script.txt /log=download.log
脚本里写synchronize remote和本地路径,就能做目录同步。配合Windows任务计划程序,可以实现定时自动下载。适合Windows服务器上需要无人值守批量下载的场景。
五、全自动方案:定时任务+脚本,零人工干预
这才是FTP批量下载的终极形态——不需要人每天手动去点下载,系统自己定时跑。Linux方案:lftp脚本 + crontab
第一步,创建一个Shell脚本 /opt/scripts/ftp_sync.sh:
#!/bin/bash
LOG_FILE="/var/log/ftp_sync.log"
echo "$(date): Starting FTP sync" >> $LOG_FILE
lftp -u $FTP_USER,$FTP_PASS $FTP_HOST << EOF
set ftp:ssl-allow yes
set mirror:use-pget-n 5
mirror --verbose --parallel=5 --only-newer /remote/backup/ /local/backup/
quit
EOF
echo "$(date): FTP sync completed" >> $LOG_FILE
第二步,crontab -e 添加定时任务,每天凌晨3点执行:
0 3 * * * /opt/scripts/ftp_sync.sh >> /var/log/ftp_cron.log 2>&1
用户名密码不要硬编码在脚本里,通过环境变量或 .netrc 文件(权限600)传入。
Windows方案:WinSCP脚本 + 任务计划程序
在WinSCP里图形化配置好连接和目标目录,导出为download.txt脚本文件。然后打开Windows任务计划程序→创建任务→触发器设为每天→操作设为启动程序,程序填winscp.com的完整路径,参数填 /script="C:\scripts\download.txt" /log="C:\logs\ftp.log"。注意WinSCP的脚本默认在当前用户下运行,如果FTP凭据涉及敏感信息,建议用专门的系统服务账户。
六、五种常见下载场景的最佳工具组合
| 场景 | 推荐工具 | 关键参数 | 预计速度 |
|---|---|---|---|
| 每天自动从FTP拉数据库备份 | lftp mirror + crontab | --parallel=5 --only-newer | 增量模式几秒到几分钟 |
| 一次性的整站文件迁移(几万文件) | lftp mirror | --parallel=8 --use-pget-n=3 | 千兆带宽能跑满60-80% |
| 下载几个超大文件(10G以上) | aria2 | -x 16 -s 16 | 千兆带宽能跑满90%+ |
| 只下载特定类型文件(如只下载.log) | lftp mirror + include/exclude | --include='.*\.log$' --exclude='.*' | 取决于匹配文件数量 |
| Windows上临时手动下载几十个文件 | FileZilla 或 WinSCP | 设置→并发传输数=10 | 够用但不极致 |
七、下载速度慢的四个真正原因
工具选对了还是慢,问题大概率不在工具本身:FTP被动模式(PASV)没开
防火墙/安全组只放了21端口,没放被动模式的数据端口范围。连接能建立但传输数据时卡住。lftp里加 set ftp:passive-mode on,服务端防火墙要放行被动模式端口范围(如30000-31000)。
FTP服务器端做了连接数限制
很多FTP服务(vsftpd、Pure-FTPd)默认限制单IP并发连接数。你把parallel开到20,服务器只接受3个,剩下的排队。vsftpd里检查 max_per_ip 参数,Pure-FTPd检查 --maxclientsperip 参数。或者跟服务器管理员协商提高限制。
海量小文件比少量大文件慢几十倍
下载一个100G的大文件,传输速度能跑到800Mbps。下载100万个100KB的小文件,实际有效传输速度可能只有50Mbps。因为每个小文件都要走一遍TCP握手+FTP命令交互(RETR→数据传输→断开),真正传输数据的时间占比极低。lftp的mirror并发多个文件可以缓解这个问题,但无法根治。如果文件实在太小太多,建议先在FTP服务器上打包成tar.gz再下载。
中间链路的问题:跨运营商、跨国、丢包
FTP服务器在国外,你在国内下载,延迟200ms+,TCP窗口增长慢,单线程速度就是上不去。解决办法:多线程(aria2分段或lftp pget)对抗高延迟;或者在国内找一台中转服务器,先lftp把文件拉到中转机,再从国内下载(中转机的国内带宽通常比跨境带宽大得多)。
FTP批量下载这件事,工具链条只有三步:能连上 → 能筛选 → 能自动化。第一步用lftp/WinSCP搞定连接和协议兼容,第二步用mirror的include/exclude或正则表达式搞定筛选,第三步用crontab或任务计划程序搞定无人值守。很多人卡在第一步和第二步之间——连上了、下载了,但每次都是全量下载,浪费时间和带宽。增量下载(mirror的--only-newer模式)是FTP批量下载里ROI最高的优化,一行参数的区别,日常下载量可能从几十G降到几十M。如果每天都要从FTP拉数据,先把增量配置好,再考虑要不要换工具。
