cmp(compare的缩写)命令主要用于:
cmp [选项] 文件1 文件2
| 选项 | 说明 |
|---|---|
| -l, --verbose | 显示所有不同的字节 |
| -s, --quiet, --silent | 不显示任何输出,只返回退出状态 |
| -i SKIP, --ignore-initial=SKIP | 跳过两个文件的前SKIP个字节 |
| -i SKIP1:SKIP2, --ignore-initial=SKIP1:SKIP2 | 跳过文件1的前SKIP1字节和文件2的前SKIP2字节 |
| -n LIMIT, --bytes=LIMIT | 最多比较LIMIT个字节 |
| -b, --print-bytes | 显示不同的字节内容 |
| --help | 显示帮助信息 |
| -v, --version | 显示版本信息 |
cmp命令的退出状态码:
比较两个文件,显示第一个差异的位置:
cmp file1.txt file2.txt
file1.txt file2.txt differ: byte 15, line 3
输出说明:文件在第15字节(第3行)处开始不同。
使用静默模式,只通过退出状态判断文件是否相同:
cmp -s file1.txt file2.txt
echo $?
# 输出 1 表示文件不同,0 表示相同
这在脚本中特别有用,可以基于比较结果执行不同操作。
使用 -l 选项显示所有不同的字节:
cmp -l file1.bin file2.bin
15 12 14
20 40 41
25 0 12
输出说明:
使用 -b 选项显示差异字节的实际内容:
cmp -b file1.txt file2.txt
file1.txt file2.txt differ: byte 15, line 3 is 114 r 115 s
输出说明:在第15字节处,file1.txt是'r'(114),file2.txt是's'(115)。
跳过文件开头的一定字节后再进行比较:
# 跳过两个文件的前10个字节
cmp -i 10 file1.bin file2.bin
# 跳过file1的前10字节和file2的前20字节
cmp -i 10:20 file1.bin file2.bin
只比较文件的前N个字节:
cmp -n 100 file1.bin file2.bin
这在大文件比较时可以提高效率。
在shell脚本中利用退出状态进行条件判断:
#!/bin/bash
if cmp -s "$1" "$2"; then
echo "文件相同"
else
echo "文件不同"
fi
使用find命令查找并比较文件:
# 比较目录中所有.txt文件与备份目录中的对应文件
find . -name "*.txt" -exec cmp -s {} /backup/{} \; -print
| 命令 | 比较方式 | 输出格式 | 适用场景 |
|---|---|---|---|
| cmp | 逐字节比较 | 字节位置、差异字节 | 二进制文件、精确差异定位 |
| diff | 行比较 | 行号、具体差异内容 | 文本文件、代码比较 |
| comm | 行比较(排序文件) | 三列输出:唯一行、唯一行、共同行 | 已排序文件的集合操作 |
| cksum/md5sum | 校验和比较 | 校验和值 | 文件完整性验证 |
比较编译后的二进制文件是否相同:
cmp program_v1 program_v2
if [ $? -eq 0 ]; then
echo "二进制文件相同"
else
echo "二进制文件有差异"
fi
验证固件文件在传输过程中是否损坏:
cmp original_firmware.bin downloaded_firmware.bin
验证恢复的数据是否与原始数据一致:
cmp -l original.dat recovered.dat | head -10
比较加密前后的文件差异(应完全不同):
cmp plaintext.txt encrypted.txt
# 期望输出:文件完全不同
使用进程替换比较两个命令的输出:
cmp <(ls /dir1) <(ls /dir2)
比较跳过特定文件头(如ELF头)的可执行文件:
# 跳过ELF头(通常64字节)
cmp -i 64 program1 program2
创建脚本批量比较目录中的文件:
#!/bin/bash
# 比较两个目录中的同名文件
dir1="$1"
dir2="$2"
for file in "$dir1"/*; do
filename=$(basename "$file")
if [ -f "$dir2/$filename" ]; then
if ! cmp -s "$file" "$dir2/$filename"; then
echo "差异文件: $filename"
fi
fi
done
-l 选项比较大型文件时,输出可能会很长-n 选项限制比较范围可以提高速度-s 选项避免不必要的输出split 命令分割后再比较