美文网首页大大史聊科技
MAC系统和Linux系统下md5获取方法

MAC系统和Linux系统下md5获取方法

作者: 建安七子 | 来源:发表于2022-09-10 13:56 被阅读0次

    前一段时间在开发一个比较复杂的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"|md5sum
    f5ac8127b3b6b85cdc13f237c6005d80  -
    

    这和网上工具算的不一样,原因是echo会自动加一个换行符,可以使用-n参数不输出这个换行符

    不输出换行符再试一下

    >> echo -n "abcd"|md5sum
    e2fc714c4727ee9395f324cd2e7f331f  -
    

    这次和工具算出来一样了

    文件校验

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

    >> md5sum Document.pdf 
    20b1f7a03886e2acb4a1127b46f32428  Document.pdf
    

    会输出文件的md5值和文件名
    配合find命令可以快速查看一个目录下所有文件的md5

    >> find ./|xargs md5sum
    md5sum: ./: Is a directory
    0f8cd5b583b41d39b31ead87aa0e58fe  ./BeanContextChildComponentProxy.java
    b2125086af1459eb370b3636bc74e07e  ./BeanContextServices.java
    c14ec136adc6c9732639e38389b64031  ./BeanContextServiceProvider.java
    9c052aec2e7e62a90b2be9cbe78df45a  ./BeanContextChild.java
    e9545230bde1ccef1cee14a5b44c3d37  ./BeanContextServicesSupport.java
    3f52d9ce3ea8c71600a3984da10afaff  ./BeanContextProxy.java
    8f3843de53a38dfb35557be11d49dc88  ./BeanContextContainerProxy.java
    9e95824832d9a6a6278c169df77db967  ./BeanContextSupport.java
    3915c59e175dea7a84fb5a0ff00dd28e  ./BeanContextMembershipEvent.java
    205ac68eef169a48858484f83991cdc9  ./BeanContext.java
    7df33512aa2b57677b6873d5f94ef306  ./BeanContextServicesListener.java
    c4cebd9f0b4d6247f7cd65707fda3f44  ./BeanContextServiceRevokedEvent.java
    e9b6ce291daaf950bdff0b652e0f591c  ./BeanContextMembershipListener.java
    38512603934c9a8812392fe44422b898  ./BeanContextChildSupport.java
    8e95864a4164640351f851062724c3f3  ./BeanContextEvent.java
    4f55377474508514123b3625b8ffe6de  ./BeanContextServiceAvailableEvent.java
    f06a414d8bdf87548feb954b970d5026  ./BeanContextServiceProviderBeanInfo.java
    86587d95875f3616d519147378dd8797  ./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.pdf
    0bee89b07a248e27c83fc3d5951213c1  test.txt
    >> md5sum -c check.out
    Document.pdf: OK
    test.txt: OK
    >> echo "abc" >> test.txt
    >> md5sum -c check.out
    Document.pdf: OK
    test.txt: FAILED
    md5sum: 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 file
    
    SYNOPSIS
         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"|md5
    f5ac8127b3b6b85cdc13f237c6005d80
    

    echo有同样的补换行符机制

    不输出换行符试一下

    >> echo -n "abcd"|md5
    e2fc714c4727ee9395f324cd2e7f331f
    

    一样了

    注意: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 md5
    md5: ./: Is a directory
    MD5 (.//BackendException.java) = 693d6290c249190f53bf2c4189df3ddd
    MD5 (.//UnknownDatabaseException.java) = 0ecdbba3648a6d025b59577ecf2b1e74
    MD5 (.//TableModifyInTransactionException.java) = a21eb795866bc59aadc79c7c3f7e94e8
    MD5 (.//NoDatabaseSelectedException.java) = 9fda10bd220ed214c1954a6713022a32
    

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

    相关文章

      网友评论

        本文标题:MAC系统和Linux系统下md5获取方法

        本文链接:https://www.haomeiwen.com/subject/jbstortx.html