前一段时间在开发一个比较复杂的shell脚本,指标之一是心愿可能拷贝到任何台机器上都能用(当然不包含win),所以脚本不会用到很多须要装置的命令,所应用的命令根本都是零碎装置时候就自带的。我的开发环境是mac,本认为很多根底的命令mac和linux应该都一样,没想到过程中还是遇到不少有细微差别的中央。字符串计算MD5就是其中之一,这篇文章简略记录一下两个零碎在计算MD5时的差别,其余的差别当前有机会再聊

Linux:md5sum

命令阐明

linux下获取md5的命令是md5sum,上面是他的帮助文件。从帮忙文档看,linux的md5sum命令次要是用来计算文件md5值的,一段文本的计算只是附带的一个性能

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

文本输入

测试文本输入md5

>> echo "abcd"|md5sumf5ac8127b3b6b85cdc13f237c6005d80  -

这和网上工具算的不一样,起因是echo会主动加一个换行符,能够应用-n参数不输入这个换行符

不输入换行符再试一下

>> echo -n "abcd"|md5sume2fc714c4727ee9395f324cd2e7f331f  -

这次和工具算进去一样了

文件校验

测试对一个文件进行校验,最简略的命令如下

>> md5sum Document.pdf 20b1f7a03886e2acb4a1127b46f32428  Document.pdf

会输入文件的md5值和文件名
配合find命令能够疾速查看一个目录下所有文件的md5

>> find ./|xargs md5summd5sum: ./: Is a directory0f8cd5b583b41d39b31ead87aa0e58fe  ./BeanContextChildComponentProxy.javab2125086af1459eb370b3636bc74e07e  ./BeanContextServices.javac14ec136adc6c9732639e38389b64031  ./BeanContextServiceProvider.java9c052aec2e7e62a90b2be9cbe78df45a  ./BeanContextChild.javae9545230bde1ccef1cee14a5b44c3d37  ./BeanContextServicesSupport.java3f52d9ce3ea8c71600a3984da10afaff  ./BeanContextProxy.java8f3843de53a38dfb35557be11d49dc88  ./BeanContextContainerProxy.java9e95824832d9a6a6278c169df77db967  ./BeanContextSupport.java3915c59e175dea7a84fb5a0ff00dd28e  ./BeanContextMembershipEvent.java205ac68eef169a48858484f83991cdc9  ./BeanContext.java7df33512aa2b57677b6873d5f94ef306  ./BeanContextServicesListener.javac4cebd9f0b4d6247f7cd65707fda3f44  ./BeanContextServiceRevokedEvent.javae9b6ce291daaf950bdff0b652e0f591c  ./BeanContextMembershipListener.java38512603934c9a8812392fe44422b898  ./BeanContextChildSupport.java8e95864a4164640351f851062724c3f3  ./BeanContextEvent.java4f55377474508514123b3625b8ffe6de  ./BeanContextServiceAvailableEvent.javaf06a414d8bdf87548feb954b970d5026  ./BeanContextServiceProviderBeanInfo.java86587d95875f3616d519147378dd8797  ./BeanContextServiceRevokedListener.java

咱们有了md5值那如何做校验呢
让咱们先把md5sum的后果写入一个文件

>> md5sum Document.pdf >> check.out>> cat check.out 20b1f7a03886e2acb4a1127b46f32428  Document.pdf

应用-c参数来进行校验

>> md5sum -c check.out Document.pdf: OK

能够看到校验胜利,这里留神,-c前面间接跟校验文件,程序是依据校验文件中保留的文件名来以以后执行目录为准进行寻找的,所以要保障这个文件对于执行目录的相对路径正确,或者改成绝对路径也行

>> cat check.out 20b1f7a03886e2acb4a1127b46f32428  /root/Document.pdf>> md5sum -c check.out /root/Document.pdf: OK

如果是多个文件呢,只有在校验文件中保留多个文件的校验后果即可

>> echo "abc" >> test.txt>> md5sum test.txt >> check.out >> cat check.out 20b1f7a03886e2acb4a1127b46f32428  Document.pdf0bee89b07a248e27c83fc3d5951213c1  test.txt>> md5sum -c check.outDocument.pdf: OKtest.txt: OK>> echo "abc" >> test.txt>> md5sum -c check.outDocument.pdf: OKtest.txt: FAILEDmd5sum: WARNING: 1 of 2 computed checksums did NOT match

如果有校验失败的文件,会提醒有几个失败了

MAC:md5

命令阐明

mac下获取md5的命令是md5,上面是他的帮助文件。mac下的md5命令就显著晋升了string计算md5值的位置,在概要外面明确阐明了string的用法

NAME     md5 – calculate a message-digest fingerprint (checksum) for a fileSYNOPSIS     md5 [-pqrtx] [-s string] [file ...]     -s string             Print a checksum of the given string.     -p      Echo stdin to stdout and append the checksum to stdout.     -q      Quiet mode - only the checksum is printed out.  Overrides the -r option.     -r      Reverses the format of the output.  This helps with visual diffs.  Does nothing when combined with the -ptx options.     -t      Run a built-in time trial.     -x      Run a built-in test script.

文本输入

测试输入md5,用管道的话,也毋庸-s命令

>> echo "abcd"|md5f5ac8127b3b6b85cdc13f237c6005d80

echo有同样的补换行符机制

不输入换行符试一下

>> echo -n "abcd"|md5e2fc714c4727ee9395f324cd2e7f331f

一样了

留神:mac下获取的后果格局和linux下有所不同

文件校验

让咱们在mac下同样进行文件校验的测试,最简略的命令如下

>> md5 web.zip MD5 (web.zip) = 73664fc49bc0ae831f73fd58530f690c

格局和linux上面差异还挺大,也会输入文件的md5值和文件名
不过应用-r参数之后就能够取得和linux下雷同格局的输入了

>> md5 -r web.zip  73664fc49bc0ae831f73fd58530f690c web.zip

配合find命令也能够疾速查看一个目录下所有文件的md5

>> find ./|xargs md5md5: ./: Is a directoryMD5 (.//BackendException.java) = 693d6290c249190f53bf2c4189df3dddMD5 (.//UnknownDatabaseException.java) = 0ecdbba3648a6d025b59577ecf2b1e74MD5 (.//TableModifyInTransactionException.java) = a21eb795866bc59aadc79c7c3f7e94e8MD5 (.//NoDatabaseSelectedException.java) = 9fda10bd220ed214c1954a6713022a32

咱们有了md5值那如何做校验呢
很遗憾,mac下的md5命令并没有相似md5sum的校验快捷性能
不过能够通过shell脚本来进行比对,就不在此举例了