Linux常用命令学习笔记:cmp

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. 注意事项

  1. 二进制文件cmp 适合比较二进制文件,而 diff 更适合文本文件
  2. 大文件:对于非常大的文件,cmp 可能会比较慢
  3. 退出状态码:在脚本中使用 -s 选项配合 $? 判断文件是否相同
  4. 权限问题:确保对要比较的文件有读取权限

核心要点总结

  • cmp 用于逐字节比较两个文件
  • 默认显示第一个不同字节的位置
  • 使用 -l 选项显示所有不同字节
  • 使用 -s 选项在脚本中静默判断
  • 适合二进制文件比较和精确差异检测
  • 退出状态码:0(相同)、1(不同)、2(错误)

作 者:南烛
链 接:https://www.itnotes.top/archives/211
来 源:IT笔记
文章版权归作者所有,转载请注明出处!


上一篇
下一篇