fltp备份文件后统计验证

上一篇(https://www.cnblogs.com/jying/p/16805821.html)记录了自己在centos使用lftp备份文件的过程 , 本篇记录自己对备份后的文件与源文件目录的对比统计 。
三种思路:
1、代码(如java等)循环遍历所有备份的源和ftp目标文件夹,统计个数对比 。
2、执行linux命令行统计ftp备份文件夹和本地源文件夹文件总大小写入统计文件,再利用java代码读取统计值后对比 。
3、执行linux命令行统计ftp备份文件夹和本地源文件夹文件总个数写入统计文件,再利用java代码读取统计值后对比 。
【fltp备份文件后统计验证】其中网上的介绍多是用的第一种方式,而且几乎全都是复制粘贴的重复垃圾文章,个人尝试可以执行 , 但文件夹较多和层级较多时会非常耗时(因为ftp的连接原理导致),最终放弃方式一 。
用到的方式为commons.net(org.apache.commons.net)包的ftp功能,网上的垃圾文章直接略过,直接用官方的实例测试:
org.apache.commons.net测试实例其中main函数里的测试方式可以是:
public static void test() throws UnknownHostException {String cmd = "-n ftp服务器ip 账号 密码 /";String[] cmds = cmd.split(" ");main(cmds);}不记得有没有参考这俩文章了:https://www.cnblogs.com/chen1281024/p/15625278.html 、https://www.cnblogs.com/leonlipfsj/p/15972372.html
然后考虑方式2,关于linux统计目录下文件大小的命令是du,
du常用的选项:-h:--human-readable 以人类可读的方式显示,即自动转为K,M,G等单位 。-a:-all 显示目录占用的磁盘空间大?。幽柯己臀募加么排炭占涞拇笮∠晗噶斜?-s:--summarize 显示目录占用的磁盘空间大?。?不含子目录和文件占用的磁盘空间大小详细列表-b:-bytes 显示目录或文件大小时,以byte为单位 。-k:--kilobytes 以KB(1024bytes)为单位输出 。-m:--megabytes 以MB为单位输出 。-c:--total 显示目录或文件占用的磁盘空间大?。?统计它们的总和 。--apparent-size:显示目录或文件自身的大小-l :统计硬链接占用磁盘空间的大小-L:统计符号链接所指向的文件占用的磁盘空间大小du -sh : 查看当前目录总共占的容量 。而不单独列出各子项占用的容量 。du -sh * | sort -n 统计当前文件夹(目录)大小,并按文件大小排序du -lh --max-depth=1 : 查看当前目录下一级子文件和子目录占用的磁盘容量 。关于以上常用选项的实例可以参考:https://blog.csdn.net/pichcar1982/article/details/121531546
因为lftp也支持du,所以貌似可以直接通过du统计服务器本地源文件目录大小和ftp服务器文件目录大小对比就可以了 , 但实际执行过程发现本地文件要比同步到ftp服务器上的文件大,于是使用ls -l查看发现单个文件大小也不一致,个人猜测是服务器本地文件上传保存的字节流和ftp备份的字节流长度不一致导致的 。还有一种解释(https://blog.csdn.net/mtawaken/article/details/8491413 或https://blog.csdn.net/weixin_42803243/article/details/123724755)说是服务器本身的存储块大小不一致导致的,所以du加参数--apparent-size即可,而我加上此参数发现还是不一致,即使单个文件显示一致了,整个目录的大小仍然有差异 。
方式3,对比文件个数, linux命令ls -l 可以按行列出目录下所有文件 , 可以直接根据行数统计出文件个数 。
# 查看当前目录下的文件数量(不包含子目录中的文件)ls -l|grep "^-"| wc -l# 查看当前目录下的文件数量(包含子目录中的文件) 注意:R,代表遍历子目录ls -lR|grep "^-"| wc -l# 查看当前目录下的文件夹目录个数(不包含子目录中的目录),同上,如果需要查看子目录的,加上Rls -l|grep "^d"| wc -lwc -l 表示统计输出信息的行数,因为经过前面的过滤已经只剩下普通文件,一个目录或文件对应一行 , 所以统计的信息的行数也就是目录或文件的个数 。参考:https://www.cnblogs.com/wangyuxing/p/15818042.html
在lftp中也可以使用该方式来统计文件个数,但有一些限制,比如lftp中的ls命令默认就是显示按行的文件详情 , 等同于普通命令ls -l,而且lftp中使用R参数无效 , 这意味着无法循环遍历子文件夹目录(了解过ftp的连接过程则知道在ftp里切换目录需要重新连接),所以在lftp中的统计文件个数命令写为:
ls 文件夹目录 | grep "^-" | wc -l这也就意味着只能统计单层的文件夹里的文件个数 。但这也是能准确统计是否备份成功的最准确方式了 。
所以我们需要对文件存储路径进行优化,优化后的存储路径应该满足最终的统计路径只有一层:

推荐阅读