【问题标题】:Comparing content of 2 files with md5sum将 2 个文件的内容与 md5sum 进行比较
【发布时间】:2021-05-28 13:05:21
【问题描述】:

如何在一个命令中比较 2 个文件的 md5 和?

我可以单独计算它们:

my_prompt$ md5sum file_1.sql
20f750ff1aa835965ec93bf36fd8cf22  file_1.sql

my_prompt$ md5sum file_2.sql
733d53913c366ee87b6ce677971be17e  file_2.sql

但是想知道如何将其组合成一个比较计算。 我尝试了不同的方法,但都失败了:

my_prompt$ md5sum file_1.sql == md5sum file_2.sql
my_prompt$ `md5sum file_1.sql` == `md5sum file_2.sql`
my_prompt$ (md5sum file_1.sql) == (md5sum file_2.sql)
my_prompt$ `md5sum file_1.sql` -eq `md5sum file_2.sql`

我在这里缺少什么? 尝试关注Compare md5 sums in bash script 和https://unix.stackexchange.com/questions/78338/a-simpler-way-of-comparing-md5-checksum,但没有成功。

【问题讨论】:

    标签: bash ubuntu md5 windows-subsystem-for-linux md5sum


    【解决方案1】:

    您需要一个评估比较的程序/内置程序。通常你会使用test/[/[[ 这样做。使用这些程序-eq 比较十进制数。因此请改用字符串比较=。

    [[ "$(md5sum file_1.sql)" = "$(md5sum file_2.sql)" ]]
    

    此命令的退出代码$? 告诉您两个字符串是否相等。

    但是,您可能想改用cmp。这个程序直接比较文件,应该更快,因为它不需要计算任何东西,而且更安全,因为它不会像哈希比较那样给出误报。

    cmp file_1.sql file_2.sql
    

    【讨论】:

    • 正是我需要的。清晰准确的解释。
    • 一个问题:要获得退出代码,您必须进行第二次调用吗?喜欢echo $?
    • 有什么方法可以将所有内容都集中到一个电话中?
    • 可以,但您通常不访问$?。相反,您可以编写类似if [[ a = b ]]; then echo equal; else echo different; fi 的内容。 cmp 直接告诉您文件是否不同,如果文件相同则保持安静。
    【解决方案2】:

    通过将文件名作为参数传递给md5sum 命令,我们可以得到类似的结果:

    $ md5sum foo.json bar.json
    07a9a5c765f5d861b506eabd02f5aa4b *foo.json
    07a9a5c765f5d861b506eabd02f5aa4b *bar.json
    

    所以,我们要比较md5sum输出的第一列:

    if [[ $(md5sum foo.json bar.json | awk '{print $1}' | uniq | wc -l) == 1 ]]
    then
        echo "Identical files"
    else
        echo "There are differences"
    fi
    

    如果我们需要返回码,我们可以使用test命令如下:

    test $(md5sum foo.json bar.json | awk '{print $1}' | uniq | wc -l) == 1
    

    让我们分解命令:

    $ md5sum foo.json bar.json
    07a9a5c765f5d861b506eabd02f5aa4b *foo.json
    07a9a5c765f5d861b506eabd02f5aa4b *bar.json
    
    $ md5sum foo.json bar.json | awk '{print $1}'
    07a9a5c765f5d861b506eabd02f5aa4b
    07a9a5c765f5d861b506eabd02f5aa4b
    
    $ md5sum foo.json bar.json | awk '{print $1}' | uniq
    07a9a5c765f5d861b506eabd02f5aa4b
    
    $ md5sum foo.json bar.json | awk '{print $1}' | uniq | wc -l
    1
    
    $ test $(md5sum foo.json bar.json | awk '{print $1}' | uniq | wc -l) == 1
    
    $ echo $?
    0
    

    【讨论】:

      【解决方案3】:

      这将适用于 bash

      $ md5sum file1 file2 | md5sum --check
      

      如果 md5 相等,两个文件都可以。您也可以将其用于 3 个或更多文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-07
        • 1970-01-01
        • 2013-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-13
        相关资源
        最近更新 更多