在linux系统中,判断文件内容是否一致是运维、开发过程中常见的需求,不同的场景可以选择不同的工具来实现,下面介绍几种常用的方法。

使用diff命令对比文件内容
diff是linux系统自带的文本对比工具,会逐行比较两个文件的内容,输出差异部分,如果两个文件内容完全一致,不会有任何输出。
基本用法
对比两个文件file1.txt和file2.txt的内容,执行以下命令:
# 对比两个文件内容 diff file1.txt file2.txt
如果两个文件内容完全一致,命令执行后不会有任何输出。如果存在差异,会输出差异的行号和具体内容,比如:
# 文件内容有差异时的输出示例 2c2 < 这是文件1的第二行内容 --- > 这是文件2的第二行内容
常用参数
- -q:仅输出文件是否有差异,不输出具体差异内容,适合只需要知道结果不需要看细节的场景
- -r:递归对比目录下的所有文件,判断两个目录下的文件内容是否一致
- -i:忽略大小写差异进行对比
使用-q参数的示例:
# 仅判断是否有差异 diff -q file1.txt file2.txt # 输出Files file1.txt and file2.txt differ表示有差异,无输出表示内容一致
使用哈希校验工具判断文件内容
哈希校验是通过计算文件的哈希值来判断内容是否一致,只要文件内容有一点不同,哈希值就会完全不同,适合大文件或者需要校验文件完整性的场景。
md5sum命令
md5sum会计算文件的MD5哈希值,MD5是常用的哈希算法,计算速度快,适合大部分场景。
先分别计算两个文件的MD5值:
# 计算file1.txt的MD5值 md5sum file1.txt # 计算file2.txt的MD5值 md5sum file2.txt
如果两个文件的MD5值完全一致,说明文件内容相同。也可以直接通过管道对比,不需要手动看值:
# 直接对比两个文件的MD5值是否一致
[ "$(md5sum file1.txt | awk '{print $1}')" = "$(md5sum file2.txt | awk '{print $1}')" ] && echo "文件内容一致" || echo "文件内容不一致"
sha256sum命令
sha256sum使用SHA256算法计算哈希值,安全性比MD5更高,适合对安全性要求较高的场景,用法和md5sum类似:
# 计算file1.txt的SHA256值
sha256sum file1.txt
# 对比两个文件的SHA256值
[ "$(sha256sum file1.txt | awk '{print $1}')" = "$(sha256sum file2.txt | awk '{print $1}')" ] && echo "文件内容一致" || echo "文件内容不一致"
使用cmp命令对比文件
cmp命令会逐字节对比两个文件,默认情况下,只要发现第一个差异就会停止输出,如果两个文件完全一致,不会有任何输出。
基本用法:
# 对比两个文件 cmp file1.txt file2.txt # 无输出表示内容一致,有输出会显示第一个差异的位置
如果需要知道所有差异的位置,可以加-l参数,会输出所有不同字节的位置和对应的字节值。
不同方法的适用场景
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| diff | 文本文件对比,需要查看具体差异内容 | 可以直观看到差异位置,支持目录递归对比 | 大文件对比速度较慢,不适合二进制文件 |
| md5sum/sha256sum | 大文件、二进制文件对比,校验文件完整性 | 计算速度快,适合任意类型文件,结果唯一 | 无法直接看到差异内容,只能判断一致或不一致 |
| cmp | 二进制文件对比,只需要知道是否有差异 | 逐字节对比,结果准确,速度快 | 输出信息较少,不适合需要看差异细节的场景 |
注意事项
- 对比文件时需要注意文件的权限,确保当前用户有读取两个文件的权限,否则会提示权限不足无法对比
- 如果文件有特殊属性比如扩展属性、ACL等,哈希校验和diff、cmp都只会对比文件内容本身,不会对比这些特殊属性
- 对于非常大的文件,哈希校验的速度会比diff更快,因为哈希计算是顺序读取文件,不需要逐行做差异匹配