4

fltp备份文件后统计验证 - 一 定 会 去 旅 行

 1 year ago
source link: https://www.cnblogs.com/jying/p/16874692.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

fltp备份文件后统计验证

o_qrcode_for_gh_e17a2d9428e7_258.jpg 原文地址:https://www.cnblogs.com/jying/p/16874692.html
作者:一定会去旅行
欢迎任何形式的转载,但请务必在文章开始位置使用明显加粗字体注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。

上一篇(https://www.cnblogs.com/jying/p/16805821.html)记录了自己在centos使用lftp备份文件的过程,本篇记录自己对备份后的文件与源文件目录的对比统计。

三种思路:

1、代码(如java等)循环遍历所有备份的源和ftp目标文件夹,统计个数对比。

2、执行linux命令行统计ftp备份文件夹和本地源文件夹文件总大小写入统计文件,再利用java代码读取统计值后对比。

3、执行linux命令行统计ftp备份文件夹和本地源文件夹文件总个数写入统计文件,再利用java代码读取统计值后对比。

其中网上的介绍多是用的第一种方式,而且几乎全都是复制粘贴的重复垃圾文章,个人尝试可以执行,但文件夹较多和层级较多时会非常耗时(因为ftp的连接原理导致),最终放弃方式一。

用到的方式为commons.net(org.apache.commons.net)包的ftp功能,网上的垃圾文章直接略过,直接用官方的实例测试:

ContractedBlock.giforg.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

# 查看当前目录下的文件夹目录个数(不包含子目录中的目录),同上,如果需要查看子目录的,加上R
ls -l|grep "^d"| wc -l

wc -l 表示统计输出信息的行数,因为经过前面的过滤已经只剩下普通文件,一个目录或文件对应一行,所以统计的信息的行数也就是目录或文件的个数。参考:https://www.cnblogs.com/wangyuxing/p/15818042.html

在lftp中也可以使用该方式来统计文件个数,但有一些限制,比如lftp中的ls命令默认就是显示按行的文件详情,等同于普通命令ls -l,而且lftp中使用R参数无效,这意味着无法循环遍历子文件夹目录(了解过ftp的连接过程则知道在ftp里切换目录需要重新连接),所以在lftp中的统计文件个数命令写为:

ls 文件夹目录 | grep "^-" | wc -l

这也就意味着只能统计单层的文件夹里的文件个数。但这也是能准确统计是否备份成功的最准确方式了。

所以我们需要对文件存储路径进行优化,优化后的存储路径应该满足最终的统计路径只有一层:

1、存储根目录/模块/直接存储文件

2、存储根目录/模块/年月/日/存储文件

3、存储根目录/模块/年月日/存储文件

4、存储根目录/年月/日/存储文件

5、存储根目录/年月/日/模块/存储文件

推荐使用方式2或方式5,而且所有存储格式应该统一,这样便于备份脚本只写一种遍历即可。我这边目前因为采用了多种存储方式,导致编写备份脚本时要分开写多个(参考上一篇文章)。

一个备份和统计的实例如下:

if [ -d 存储根目录/模块/年月/日 ]; then
    echo "目录存在"
    ls 存储根目录/模块/年月/日/存储文件 -l|grep "^-"| wc -l >> /本地脚本目录/bak_logs/年月/日/模块.bak.count
lftp -u 账号,密码 ftp服务器ip << EOF
    mirror --reverse --only-missing --only-newer 存储根目录/模块/年月/日 --parallel=3 --log=/本地脚本目录/logs/年月/日/模块_小时.log
    ls 存储根目录/模块/年月/日/存储文件 |grep "^-"| wc -l >> /本地脚本目录/bak_logs/年月/日/模块.bak.count
    bye
EOF
else
    echo "不存在"
fi

有了统计个数,就可以通过代码来读取并推送邮件给管理员了。

ContractedBlock.gifExpandedBlockStart.gif

java获取统计信息并邮件推送给管理员

ContractedBlock.gifExpandedBlockStart.gif

发送邮件

o_qrcode_for_gh_e17a2d9428e7_258.jpg 生活不止眼前的苟且,还有诗和远方~~
原文地址:https://www.cnblogs.com/jying/p/16874692.html
作者:一定会去旅行
欢迎任何形式的转载,但请务必在文章开始位置使用明显加粗字体注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK