服务器上12个站,每个站都有/wp-content/cache/下面几万个文件、/uploads/下面三年前的缩略图、/backup/下面累积了半年的数据库备份——总共十几万个小文件要清理。你用FileZilla连上去,打开目录等了30秒才加载完文件列表,选中第一批3000个文件点删除,进度条走到一半卡住了,连接超时断开。重新连上去发现删了大概一半,剩下的还在原地。换WinSCP再试,删除速度比FileZilla还慢,因为它是单线程逐个文件删。换lftp一个mrm *.log命令三秒清空几千个日志文件,mirror --delete可以在远程目录上自动清理本地已不存在的旧文件。同样一台服务器上的十几个站点,FTP图形客户端删到人崩溃,命令行工具几十秒跑完。你到底是在管理网站还是在当FTP文件搬运工
FTP批量删除这件事,图形客户端和命令行工具是两个世界
图形FTP客户端(FileZilla、WinSCP、FlashFXP)的设计出发点是文件传输和浏览,批量删除是附加功能。面对几千上万个小文件时,单线程逐个删除的速度慢到离谱,而且中间任何一次连接中断都会让操作中断。命令行工具(lftp、curl、Python脚本)的设计出发点就是自动化批量操作,多线程并行、断线自动重连、支持正则匹配删除,效率不在一个量级。如果你的FTP批量删除需求超过1000个文件或者涉及多个站点,图形客户端本质上是错误工具
一、八款工具跑了同一个清理任务,速度差了上百倍
测试任务:一台VPS上12个WordPress站,需要清理所有站的/wp-content/cache/目录(平均每个站约8000-12000个小文件,共约12万文件)。八款工具的实际表现:
核心结论:FTP协议本身就是逐个文件操作的,图形客户端的瓶颈不是软件而是协议本身。8000个小文件用图形客户端删,每个文件都要经历"客户端发delete命令 → 服务器执行 → 返回确认"这样一个来回,8000次网络往返即使每次只要50毫秒也要400秒。lftp和Python脚本的"快"不是因为删得快,而是因为它们是在服务器端批量执行(通过Shell命令或递归遍历),减少了网络往返次数
二、四种删除方式的底层原理,差距根源在这里
方式1:图形客户端逐文件删除
FileZilla、WinSCP、FlashFXP、CuteFTP都属于这类。每个文件一次FTP DELETE命令+一次服务器响应,8000个文件=8000次网络往返。如果中间网络波动断开,已经删了的部分不会记录,重新连上后不知道哪些删了哪些没删,只能重来

方式2:FTPRush脚本自动化
FTPRush支持内置脚本语言,可以写循环批量删除。比手动快但仍然走FTP协议逐文件删除。优势在于自动化——多个站点可以写在一个脚本里串行执行,不用人盯着,但单站删除速度没有质的提升
方式3:lftp/curl服务端执行
lftp的mrm本质上是在连接后执行一条命令让服务器端批量处理,mirror --delete更高效——对比本地目录和远程目录差异,只发一次指令让服务器清理多余文件。从8000次网络往返缩减到1次,速度差距就在这
方式4:Python脚本+SFTP服务端rm
paramiko通过SSH连上服务器后直接执行rm -rf命令,删除操作完全在服务器本地完成,不经过SFTP文件传输通道。这是所有方式中最快的——12万文件清完不到30秒。但需要服务器支持SSH登录
三、lftp:图形客户端用了三年不知道的命令行神器
lftp在Linux下一条命令安装(apt install lftp / yum install lftp),Windows下也有Cygwin或WSL版本。以下六个命令覆盖了90%的FTP批量删除场景:

# 1. 连接并登录lftp ftp://用户名:密码@服务器IP:21# 2. 批量删除匹配文件(最常用)mrm *.log # 删除当前目录所有.log文件mrm cache-* # 删除所有cache-开头的文件mrm -r /wp-content/cache/* # 递归删除目录下所有文件# 3. 镜像同步删除(远程删掉本地没有的文件)mirror --delete /local/dir /remote/dir# 对比本地目录,远程多了的就删掉# 4. 反向镜像(上传并删除远程多余文件)mirror -R --delete /local/dir /remote/dir# 5. 批量删除指定天数前的文件cls -lt --date "30 days ago" | grep "\.gz$" | awk '{print $NF}' | xargs -I{} rm {}# 6. 自动重连设置(放在~/.lftprc中)set net:reconnect-interval-base 5 # 断线5秒后自动重连set net:max-retries 10 # 最多重试10次
多站点批量清理的Shell循环模板
#!/bin/bashSITES=("site1.com" "site2.com" "site3.com")FTP_USER="ftpuser"FTP_PASS="ftppass"FTP_HOST="192.168.1.100"for site in "${SITES[@]}"; doecho "清理 $site 缓存..."lftp -u $FTP_USER,$FTP_PASS $FTP_HOST << EOFcd /www/wwwroot/$site/wp-content/cachemrm -r *byeEOFdoneecho "全部完成"和FileZilla比效率差多少
- 单站8000缓存文件:FileZilla约8-12分钟(经常断连),lftp的mrm约3-5秒
- 12站共12万文件:FileZilla至少2-3小时(几乎不可能不中断),lftp Shell循环约30-60秒
- 定时自动清理:FileZilla不支持,lftp+crontab完美实现
- 断连恢复:FileZilla从头再来,lftp自动重连+重试
四、Python paramiko:比lftp更快,但有前置条件
如果你的服务器开了SSH(大部分VPS默认都开),paramiko直接SSH进去执行rm命令,完全不经过FTP/SFTP的文件传输协议,速度最快:
import paramikoimport threading# 多站点并行清理SITES = [{'host': '192.168.1.100', 'path': '/www/wwwroot/site1.com/wp-content/cache/*'},{'host': '192.168.1.100', 'path': '/www/wwwroot/site2.com/wp-content/cache/*'},# ... 更多站点]def clean_site(site):ssh = paramiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh.connect(site['host'], username='root', password='xxx')# rm -rf 在服务器本地执行,毫秒级完成stdin, stdout, stderr = ssh.exec_command(f"rm -rf {site['path']}")err = stderr.read().decode()if err:print(f"站点 {site['path']} 清理出错: {err}")else:print(f"站点 {site['path']} 清理完成")ssh.close()# 多线程并行清理多个站点threads = []for site in SITES:t = threading.Thread(target=clean_site, args=(site,))t.start()threads.append(t)for t in threads:t.join()print("所有站点清理完成")
paramiko方案12个站并行清理总耗时约2-3秒(取决于服务器响应速度),比lftp的30-60秒更快。但前置条件是需要SSH权限(root或sudo),共享主机通常没有。这种情况下lftp是更好的选择。
五、四个最容易翻车的地方,图形客户端根本不会提醒你
六、六个场景的工具选择速查
最后说一句
FTP批量删除这个需求暴露出来的问题,本质上不是"选哪个工具",而是图形FTP客户端的批量操作能力被严重高估了。FileZilla和WinSCP是非常好的文件传输工具,但它们的批量删除设计在几千个文件的场景下就是不行的——这是FTP协议本身逐文件操作的特性决定的,不是软件的问题。
如果你管理着超过3个站点,花15分钟学一下lftp的基本命令,之后每一次清理缓存、删除日志、清理备份文件都能省下至少半小时。如果站点超过10个或者分布在多台服务器上,Python paramiko脚本是终极方案——一次写好,crontab每周自动跑,从此FTP批量删除这件事从你的待办清单里永久消失。图形客户端处理批量删除的时间成本,比你学lftp的时间成本高得多

