Linux shell编程学习笔记42:md5sum

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。

相关推荐
云飞云共享云桌面2 分钟前
8位机械工程师如何共享一台图形工作站算力?
linux·服务器·网络
Peter_chq39 分钟前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
一坨阿亮2 小时前
Linux 使用中的问题
linux·运维
dsywws3 小时前
Linux学习笔记之vim入门
linux·笔记·学习
幺零九零零3 小时前
【C++】socket套接字编程
linux·服务器·网络·c++
小林熬夜学编程5 小时前
【Linux系统编程】第四十一弹---线程深度解析:从地址空间到多线程实践
linux·c语言·开发语言·c++·算法
程思扬5 小时前
为什么Uptime+Kuma本地部署与远程使用是网站监控新选择?
linux·服务器·网络·经验分享·后端·网络协议·1024程序员节
sun0077005 小时前
拷贝 cp -rdp 和 cp -a
linux·运维·服务器
wowocpp6 小时前
ubuntu 22.04 server 安装 anaconda3
linux·运维·ubuntu
乡村农夫6 小时前
cuda 环境搭建
linux