0 前言
前几天在国产电脑上遇到一个问题,先后接到两个文件,如何判断这两个文件内容是否相同?
如果是在Windows系统,可以用fc命令,或者用我自己写的FileInfo,提取两个文件有MD5、SHA1、CRC32值进行比较来判断。
其实,在Linux系统中,提供了md5sum命令来计算md5值。
MD5 全称是报文摘要算法(Message-Digest Algorithm 5),可以对任意长度的信息逐位进行计算,产生一个二进制长度为128位(十六进制长度就是32位)的校验值(checksums,或称"指纹""报文摘要"),不同的信息产生相同的报文摘要的可能性是非常非常之小的。
1 md5sum命令的功能和格式
我们可以使用命令 md5sum --help命令 查看它的用法:
purpleEndurer @ bash \w $ md5sum --help
Usage: md5sum [OPTION]... [FILE]...
Print or check MD5 (128-bit) checksums.
With no FILE, or when FILE is -, read standard input.
-b, --binary read in binary mode
-c, --check read MD5 sums from the FILEs and check them
--tag create a BSD-style checksum
-t, --text read in text mode (default)
Note: There is no difference between binary and text mode option on GNU system.
The following four options are useful only when verifying checksums:
--quiet don't print OK for each successfully verified file
--status don't output anything, status code shows success
--strict exit non-zero for improperly formatted checksum lines
-w, --warn warn about improperly formatted checksum lines
--help display this help and exit
--version output version information and exit
The sums are computed as described in RFC 1321. When checking, the input
should be a former output of this program. The default mode is to print
a line with checksum, a character indicating input mode ('*' for binary,
space for text), and name for each FILE.
GNU coreutils online help: <http://www.gnu.org/software/coreutils/\>
Report md5sum translation bugs to <http://translationproject.org/team/\>
For complete documentation, run: info coreutils 'md5sum invocation'
purpleEndurer @ bash \w $
1.1 md5sum命令的功能
采用MD5报文摘要算法打印或校验 MD5 (128-位) 校验值。
1.2 md5sum命令的格式
md5sum [选项]... [文件]...
1.2.1 选项及功能
选项 | 说明 | 备注 |
---|---|---|
-b --binary | 以二进制模式读取文件 | GNU系统上的二进制模式选项和文本模式选项之间没有区别 |
-c --check | 从 FILE 中读取 MD5 总和并检查它们 | |
--tag | 创建一个 BSD 样式的校验和 | |
-t --text | 以文本模式读取文件(默认) | GNU系统上的二进制选项和文本模式选项之间没有区别 |
--quiet | 不要为每个成功验证的文件打印 OK | 这四个选项仅在验证校验和时有用 |
--status | 不输出任何内容,状态代码显示成功 | 这四个选项仅在验证校验和时有用 |
--strict | 退出非零,用于格式不正确的校验行 | 这四个选项仅在验证校验和时有用 |
-w --warn | 发现格式不正确的校验行时进行警告 | 这四个选项仅在验证校验和时有用 |
--help | 显示此帮助并退出 | |
--version | 输出版本信息并退出 |
1.2.2 其它说明
如果没有 指定文件,或者当 文件 为 - 时,读取标准输入。
2 md5sum命令使用实例
2.1 用默认的文本模式读取指定文件并输出md5校验值
purpleEndurer @ bash ~ $ ++echo "123456" > 1.txt++
purpleEndurer @ bash ~ $ ++md5sum 1.txt++
f447b20a7fcbf53a5d5be013ea0b15af 1.txt
我们先用 echo命令创建文件1.txt,文件内容是:123456
然后我们用md5sum命令来输出文件1.txt的md5校验值:f447b20a7fcbf53a5d5be013ea0b15af
2.2 用二进制模式读取指定文件并输出md5校验值
purpleEndurer @ bash ~ $ md5sum -b 1.txt
f447b20a7fcbf53a5d5be013ea0b15af *1.txt
可以看到,当我们指定用二进制模式读取时,被读取的文件名名前多了一个*。
2.3 用默认的文本模式读取指定字符串并输出md5校验值
purpleEndurer @ bash ~ $ ++echo "123456" | md5sum++
f447b20a7fcbf53a5d5be013ea0b15af -
由于我们没有指定文件,所以显示的文件名是-,代表标准输入。
如果我们不使用echo命令:
purpleEndurer @ bash ~ $ ++"123456" | md5sum++
bash: 123456: command not found
d41d8cd98f00b204e9800998ecf8427e -
仍然可以获得 md5校验值,不过在此之前会显示一条错误信息:bash: 123456: command not found。
2.4 用二进制模式读取指定字符串并输出md5校验值
purpleEndurer @ bash ~ $ ++echo "123456" | md5sum -b++
f447b20a7fcbf53a5d5be013ea0b15af *-
同样,代表标准输入的-前有*。
2.5 md5sum -c md5文件:用md5校验值校验文件
purpleEndurer @ bash \w $ ++echo "123456" > 1.txt++
purpleEndurer @ bash \w $ ++md5sum 1.txt > 123456.md5++
purpleEndurer @ bash \w $ ++cat 123456.md5++
f447b20a7fcbf53a5d5be013ea0b15af 1.txt
purpleEndurer @ bash \w $ ++md5sum -c 123456.md5++
1.txt: OK
purpleEndurer @ bash \w $ ++echo "12345678" > 1.txt++
purpleEndurer @ bash \w $ ++md5sum -c 123456.md5++
1.txt: FAILED
md5sum: WARNING: 1 computed checksum did NOT match
purpleEndurer @ bash \w $
我们先用 命令 echo "123456" > 1.txt 创建文件1.txt,文件内容是:123456
接着使用命令 md5sum 1.txt > 123456.md5 将文件 1.txt的md5校验值保存到文件 123456.md5
然后用命令 cat 123456.md5 查看 文件 123456.md5的内容。
再用命令md5sum -c 123456.md5 来对文件1.txt进行校验,结果:
1.txt: OK
接着我们使用命令 echo "12345678" > 1.txt 文件1.txt的内容改为:12345678
再用命令md5sum -c 123456.md5 来对文件1.txt进行校验,结果:
1.txt: FAILED
md5sum: WARNING: 1 computed checksum did NOT match
2.6 md5sum -c --quiet md5文件:用md5校验值校验文件,文件成功验证时不打印 OK
purpleEndurer @ bash \w $ ++echo "123456" > 1.txt++
purpleEndurer @ bash \w $ ++md5sum -c --quiet 123456.md5++
purpleEndurer @ bash \w $ ++echo "12345678" > 1.txt++
purpleEndurer @ bash \w $ ++md5sum -c --quiet 123456.md5++
1.txt: FAILED
md5sum: WARNING: 1 computed checksum did NOT match
purpleEndurer @ bash \w $
这里我们先后执行了两次命令:md5sum -c --quiet 123456.md5,注意两次命令反馈信息的差异。
当我们第一次执行命令md5sum -c --quiet 123456.md5时,由于验证成功,所以没有显示信息。
当我们修改了1.txt文件的内容后,第二次执行命令md5sum -c --quiet 123456.md5时,由于验证不成功,所以看到了信息:
1.txt: FAILED
md5sum: WARNING: 1 computed checksum did NOT match
2.7 md5sum -c --quiet --status md5文件:用md5校验值校验文件,通过状态代码反馈校验是否成功
purpleEndurer @ bash \w $ echo "123456" > 1.txt
purpleEndurer @ bash \w $ md5sum 1.txt > 123456.md5
purpleEndurer @ bash \w $ md5sum -c --quiet --status 123456.md5
purpleEndurer @ bash \w $ echo $?
0
purpleEndurer @ bash \w $ echo "12345678" > 1.txt
purpleEndurer @ bash \w $ md5sum -c --quiet --status 123456.md5
purpleEndurer @ bash \w $ echo $?
1
purpleEndurer @ bash \w $
由于指定了--status选项,所以不论md5sum命令对文件校验是否成功,都不会显示信息,我们可以使用$?获取命令的状态代码来判断校验是否成功。
当我们第一次执行命令md5sum -c --quiet --status 123456.md5时,由于验证成功,$?的值为0。
当我们修改了1.txt文件的内容后,第二次执行命令md5sum -c --quiet 123456.md5时,由于验证不成功,$?的值为1。