如何使用lftp统计本地与远程目录的文件差异数量
问题场景
编写文件上传脚本时,需要先按规则统计文件数量,再执行本地目录到远程FTP目录的上传操作,核心依赖是上传前拿到本地与远程目录的差异文件计数。
本地环境下可直接使用diff -q dir1/ dir2/ | wc -l统计两个目录的差异文件数,但该命令无法在lftp中运行。
已验证无效的方案
- 直接在lftp指令中调用diff命令:lftp本身不内置diff命令,执行以下命令无法得到预期结果
lftp -e "set ftp:ssl-allow no; diff -q /XXXXX/Y/ tmp/A_000/ | wc -l; bye" -u username,password remote_storage_url
上述命令中/XXXXX/Y/为远程路径,tmp/A_000/为本地路径。
- 尝试使用带
--dry-run参数的mirror命令统计:实际执行mirror上传时会正常输出待传输文件数量,但添加--dry-run参数后仅展示待删除文件相关信息,不返回待上传新增文件计数,两种场景执行结果如下:- 实际执行mirror命令的输出:
jayesh@ubuntu:~/test$ lftp -e "set ftp:ssl-allow no; mirror -R tmp/A_000/ /XXXXX/Y/ ; bye" -u username,password remote_storage_url New: 11 files, 0 symlinks 19046373 bytes transferred in 50 seconds (371.8 KiB/s) To be removed: 0 directories, 11 files, 0 symlinks
- 添加
--dry-run参数的执行输出:
jayesh@ubuntu:~/test$ lftp -e "set ftp:ssl-allow no; mirror -R tmp/A_000/ /XXXXX/Y/ --dry-run ; bye" -u username,password remote_storage_url mkdir -p ftp://username:password@remote_storage_url/%2F/XXXXX/Y/ To be removed: 0 directories, 11 files, 0 symlinks
可行实现方案
核心问题是--dry-run模式默认不输出详细待传输文件列表,添加-v(verbose)参数即可打印所有待操作的文件条目,再通过本地shell工具过滤统计即可。注意管道、wc这类shell命令不能写在lftp的交互指令内部,要放在lftp进程外层处理标准输出。
统计待上传差异文件数(本地存在、远程缺失/不一致的文件)
执行以下命令即可得到准确计数:
lftp -u username,password remote_storage_url <<EOF set ftp:ssl-allow no mirror -R -v --dry-run tmp/A_000/ /XXXXX/Y/ bye EOF | grep -E '^get ' | wc -l
命令说明:
- 用here-document方式传入lftp指令,避免多层引号嵌套的转义问题
-v参数开启详细输出,dry-run模式下会逐行打印所有待上传文件,每一条待上传记录以get开头- 本地用
grep过滤出待上传文件行,wc -l统计行数即为待上传的差异文件总数
扩展:统计待删除差异文件数(远程存在、本地缺失的文件)
如果需要统计双向差异,可执行以下命令得到待删除文件数:
lftp -u username,password remote_storage_url <<EOF set ftp:ssl-allow no mirror -R -v --dry-run tmp/A_000/ /XXXXX/Y/ bye EOF | grep -E '^rm ' | wc -l
优化校验精度
如果需要基于文件内容而非修改时间、文件大小判断差异,可在mirror参数中添加--ignore-time --ignore-size,此时mirror会基于文件校验和判断是否需要传输,统计结果更精准。
内容的提问来源于stack exchange,提问作者Jayesh
相关产品推荐
相关产品推荐

