微服务
微服务架构:如何用十步解耦你的系统?
深度:微服务如何解耦,对于已经紧耦合的架构如何重构?
关注
数据库相关
快速对比文件是否存在差异
ufw常用参数
devpi使用记录
本文档使用 MrDoc 发布
-
+
首页
快速对比文件是否存在差异
# 快速对比文件是否存在差异 ## 总结 对于两个完全一致的文件,任何方法都需要完全读取这两个文件。 对于有差异的文件,读取文件的元数据(如文件的大小)比读取文件内容快得多。 读取到第一个有差异的字节后立即退出,速度会更快 速度由快到慢:`diff -q`,`cmp --silent`,`md5sum` ### Python 库:filecmp ``` import filecmp status = filecmp.cmp('a.sql', 'tmp/b.sql') if status: print('文件一致') else: print('文件不一致') ``` <details> <summary>源码</summary> ```py _cache = {} BUFSIZE = 8*1024 def cmp(f1, f2, shallow=True): """Compare two files. Arguments: f1 -- First file name f2 -- Second file name shallow -- Just check stat signature (do not read the files). defaults to True. Return value: True if the files are the same, False otherwise. This function uses a cache for past comparisons and the results, with cache entries invalidated if their stat information changes. The cache may be cleared by calling clear_cache(). """ s1 = _sig(os.stat(f1)) s2 = _sig(os.stat(f2)) if s1[0] != stat.S_IFREG or s2[0] != stat.S_IFREG: return False if shallow and s1 == s2: return True if s1[1] != s2[1]: return False outcome = _cache.get((f1, f2, s1, s2)) if outcome is None: outcome = _do_cmp(f1, f2) if len(_cache) > 100: # limit the maximum size of the cache clear_cache() _cache[f1, f2, s1, s2] = outcome return outcome def _do_cmp(f1, f2): bufsize = BUFSIZE with open(f1, 'rb') as fp1, open(f2, 'rb') as fp2: while True: b1 = fp1.read(bufsize) b2 = fp2.read(bufsize) if b1 != b2: return False if not b1: return True ``` </details> ### 命令:cmp Linux cmp 命令用于比较两个文件是否有差异。 当相互比较的两个文件完全一样时,则该指令不会显示任何信息。若发现有所差异,预设会标示出第一个不同之处的字符和列数编号。 若不指定任何文件名称或是所给予的文件名为"-",则 cmp 指令会从标准输入设备读取数据。 语法格式 ``` cmp [-clsv][-i < 字符数目 >][--help][第一个文件][第二个文件] ``` 参数说明: ``` -c 或--print-chars 除了标明差异处的十进制字码之外,一并显示该字符所对应字符。 -i< 字符数目 > 或--ignore-initial=< 字符数目 > 指定一个数目。 -l 或--verbose 标示出所有不一样的地方。 -s 或--quiet 或--silent 不显示错误信息。 -v 或--version 显示版本信息。 --help 在线帮助。 ``` ### 命令:diff [# Linux diff 命令](https://www.runoob.com/linux/linux-comm-diff.html) Linux diff 命令用于比较文件的差异。 diff 以逐行的方式,比较文本文件的异同处。如果指定要比较目录,则 diff 会比较目录中相同文件名的文件,但不会比较其中子目录。 语法格式 ``` diff [-abBcdefHilnNpPqrstTuvwy][-< 行数 >][-C < 行数 >][-D < 巨集名称 >][-I < 字符或字符串 >][-S < 文件 >][-W < 宽度 >][-x < 文件或目录 >][-X < 文件 >][--help][--left-column][--suppress-common-line][文件或目录 1][文件或目录 2] ``` 参数说明: ``` -q 或--brief 仅显示有无差异,不显示详细的信息。 ``` ### 命令:md5sum **md5sum 命令**采用 MD5 报文摘要算法(128 位)计算和检查文件的校验和。一般来说,安装了 Linux 后,就会有 md5sum 这个工具,直接在命令行终端直接运行。 MD5 算法常常被用来验证网络文件传输的完整性,防止文件被人篡改。MD5 全称是报文摘要算法(Message-Digest Algorithm 5),此算法对任意长度的信息逐位进行计算,产生一个二进制长度为 128 位(十六进制长度就是 32 位)的“指纹”(或称“报文摘要”),不同的文件产生相同的报文摘要的可能性是非常非常之小的。 语法格式 ``` md5sum(选项)(参数) ``` 参数说明: ``` -b:二进制模式读取文件; -t 或--text:把输入的文件作为文本文件看待; -c:从指定文件中读取 MD5 校验和,并进行校验; --status:验证成功时不输出任何信息; -w:当校验不正确时给出警告信息。 ``` ### 对比两个完全一致的文件 ``` root@ubuntu:/datas/tmp# ll total 3010152 drwxr-xr-x 2 root root 4096 Sep 7 12:30 ./ drwxr-xr-x 6 root root 4096 Sep 7 12:03 ../ -rw-r--r-- 1 root root 1541185906 Sep 7 12:04 a.sql -rw-r--r-- 1 root root 1541185906 Sep 7 12:30 b.sql root@ubuntu:/datas/tmp# time diff -q a.sql b.sql real 0m0.977s user 0m0.176s sys 0m0.796s root@ubuntu:/datas/tmp# time cmp --silent a.sql b.sql || echo "files are different" real 0m1.078s user 0m0.212s sys 0m0.860s root@ubuntu:/datas/tmp# time cmp a.sql b.sql real 0m2.385s user 0m1.516s sys 0m0.860s root@ubuntu:/datas/tmp# time diff a.sql b.sql ^C real 0m14.942s user 0m0.000s sys 0m2.064s root@ubuntu:/datas/tmp# ``` ### 对比两个仅文件尾有差异的文件 ``` root@ubuntu:/datas/tmp# echo '\nabc123'>>b.sql root@ubuntu:/datas/tmp# ll total 3010152 drwxr-xr-x 2 root root 4096 Sep 7 12:30 ./ drwxr-xr-x 6 root root 4096 Sep 7 12:03 ../ -rw-r--r-- 1 root root 1541185906 Sep 7 12:04 a.sql -rw-r--r-- 1 root root 1541185915 Sep 7 12:46 b.sql root@ubuntu:/datas/tmp# time diff -q a.sql b.sql Files a.sql and b.sql differ real 0m0.001s user 0m0.000s sys 0m0.000s root@ubuntu:/datas/tmp# time cmp --silent a.sql b.sql || echo "files are different" real 0m0.001s user 0m0.000s sys 0m0.000s files are different root@ubuntu:/datas/tmp# time cmp a.sql b.sql cmp: EOF on a.sql real 0m19.599s user 0m1.456s sys 0m1.112s root@ubuntu:/datas/tmp# time cmp a.sql b.sql cmp: EOF on a.sql real 0m2.408s user 0m1.560s sys 0m0.844s root@ubuntu:/datas/tmp# time md5sum a.sql daacbaa4adf89c61cb4c85b56c778cda a.sql real 0m3.550s user 0m3.192s sys 0m0.348s root@ubuntu:/datas/tmp# time md5sum b.sql e29f628a6d5af890ec40cf728ec6c348 b.sql real 0m3.548s user 0m3.220s sys 0m0.316s ```
幻翼
2021年9月7日 14:45
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码