1. 命令概述
- 命令名称:
cmp (英文全拼:compare)
- 核心功能:逐字节比较两个文件,检查它们是否完全相同
- 主要用途:文件差异检测、二进制文件比较、数据一致性验证
2. 语法格式
cmp [选项] 文件1 文件2
3. 常用选项
| 选项 | 说明 |
|---|
-l | 显示所有不同的字节,包括字节位置和内容 |
-s | 静默模式,不显示任何输出,只返回退出状态码 |
-i | 跳过前 N 个字节开始比较 |
-n | 只比较前 N 个字节 |
-b | 显示不同字节的 ASCII 字符 |
--help | 显示帮助信息 |
--version | 显示版本信息 |
4. 输出说明
(1) 默认输出
当两个文件不同时,cmp 会显示第一个不同字节的位置:
文件1 文件2 不同:第 N 字节 行 M
(2) 使用 -l 选项的详细输出
N 字节 1 字节 2
- N:字节位置(十进制)
- 字节 1:文件1 中该字节的内容(八进制)
- 字节 2:文件2 中该字节的内容(八进制)
(3) 退出状态码
| 状态码 | 含义 |
|---|
0 | 文件完全相同 |
1 | 文件不同 |
2 | 发生错误(如文件不存在) |
5. 常用实例详解
(1) 基本比较
# 比较两个文件
cmp file1.txt file2.txt
# 输出示例:file1.txt file2.txt 不同:第 1024 字节 行 10
(2) 显示所有不同字节
# 显示所有不同的字节及其位置
cmp -l file1.bin file2.bin
# 输出示例:
# 1024 150 151
# 1025 152 153
# 1026 154 155
(3) 静默模式(脚本中使用)
# 不显示输出,只通过退出状态码判断
cmp -s file1.txt file2.txt
if [ $? -eq 0 ]; then
echo "文件相同"
else
echo "文件不同"
fi
(4) 跳过前 N 个字节比较
# 跳过前 100 个字节开始比较
cmp -i 100 file1.bin file2.bin
(5) 只比较前 N 个字节
# 只比较前 1024 个字节
cmp -n 1024 file1.bin file2.bin
(6) 显示 ASCII 字符
# 显示不同字节的 ASCII 字符
cmp -b file1.txt file2.txt
# 输出示例:file1.txt file2.txt 不同:第 1024 字节 行 10 是 150 A 151 B
6. 实际应用场景
场景一:配置文件差异检查
# 比较两个版本的配置文件
cmp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
场景二:备份文件完整性验证
# 验证备份文件是否完整
cmp -s original_file.tar.gz backup_file.tar.gz
if [ $? -ne 0 ]; then
echo "备份文件损坏,需要重新备份"
fi
(3) 二进制文件比较
# 比较两个可执行文件
cmp -l /usr/bin/python3 /usr/bin/python3.8
(4) 结合 find 命令批量比较
# 比较两个目录下的同名文件
find dir1 -type f -exec sh -c 'cmp -s "$1" "dir2/${1#dir1/}"' sh {} \;
7. 与其他比较命令的区别
| 命令 | 比较方式 | 输出格式 | 适用场景 |
|---|
cmp | 逐字节比较 | 字节位置 | 二进制文件、精确比较 |
diff | 逐行比较 | 行差异 | 文本文件、显示具体差异 |
comm | 逐行比较 | 三列输出 | 找出两个文件的共同行和独有行 |
8. 注意事项
- 二进制文件:
cmp 适合比较二进制文件,而 diff 更适合文本文件
- 大文件:对于非常大的文件,
cmp 可能会比较慢
- 退出状态码:在脚本中使用
-s 选项配合 $? 判断文件是否相同
- 权限问题:确保对要比较的文件有读取权限
核心要点总结:
cmp 用于逐字节比较两个文件
- 默认显示第一个不同字节的位置
- 使用
-l 选项显示所有不同字节
- 使用
-s 选项在脚本中静默判断
- 适合二进制文件比较和精确差异检测
- 退出状态码:0(相同)、1(不同)、2(错误)