【问题标题】:Only get hash value using md5sum (without filename)仅使用 md5sum 获取哈希值(无文件名)
【发布时间】:2011-04-10 09:46:57
【问题描述】:

我使用md5sum 为文件生成哈希值。 但我只需要接收哈希值,而不是文件名。

md5=`md5sum ${my_iso_file}`
echo ${md5}

输出:

3abb17b66815bc7946cefe727737d295  ./iso/somefile.iso

如何“剥离”文件名并只保留值?

【问题讨论】:

  • 很奇怪这不是 md5sum 的选项。
  • 同意! 为什么这不是一个选项? GNU-Master 能不能解释一下?
  • 当你可以用一些正则表达式修剪结果时,为什么你需要一个“only hash”标志? (我很讽刺)

标签: bash shell md5sum


【解决方案1】:

依靠head

md5_for_file=`md5sum ${my_iso_file}|head -c 32`

【讨论】:

    【解决方案2】:

    为了完整起见,sed 使用正则表达式和捕获组的方式:

    md5=$(md5sum "${my_iso_file}" | sed -r 's:\\*([^ ]*).*:\1:')
    

    正则表达式捕获组中的所有内容,直到到达空格。要使捕获组正常工作,您需要捕获 sed 中的所有内容。

    (更多关于 sed 和捕获组的信息:How can I output only captured groups with sed?

    作为 sed 中的分隔符,我使用冒号,因为它们在文件路径中无效,而且我不必转义文件路径中的斜杠。

    【讨论】:

    • 为什么要捕获?你可以简单地删除空格和后面的内容:sed 's: .*::' 做同样的事情!
    【解决方案3】:

    好吧,我今天也遇到了同样的问题,但是我在运行find 命令时尝试获取文件 MD5 哈希。

    我得到了投票最多的问题,并将其包装在一个名为 md5 的函数中,以便在 find 命令中运行。我的任务是计算文件夹中所有文件的哈希值并将其输出为hash:filename

    md5() { md5sum $1 | awk '{ printf "%s",$1 }'; }
    export -f md5
    find -type f -exec bash -c 'md5 "$0"' {} \; -exec echo -n ':' \; -print
    

    所以,我从这里和 'find -exec' a shell function in Linux

    那里得到了一些作品

    【讨论】:

      【解决方案4】:

      md5sum 如果文件名中有反斜杠,则在哈希之前放置一个反斜杠。第一个空格之前的前 32 个字符或任何内容可能不是正确的哈希值。

      使用标准输入时不会发生这种情况(文件名将只是 -),因此 pixelbeat's answer 可以使用,但许多其他需要添加类似 | tail -c 32 的内容。

      【讨论】:

        【解决方案5】:

        另一种方法是:

        md5sum filename | cut -f 1 -d " "
        

        cut 会将行拆分为每个空格并仅返回第一个字段。

        【讨论】:

          【解决方案6】:

          一个简单的数组赋值就可以了...请注意,Bash 数组的第一个元素可以仅通过 name 而不使用 [0] 索引来寻址,即 $md5 仅包含 md5sum 的 32 个字符.

          md5=($(md5sum file))
          echo $md5
          # 53c8fdfcbb60cf8e1a1ee90601cc8fe2
          

          【讨论】:

          • 第一行在 for 循环的 do 部分中不起作用...作为 Bash 新手,我还不知道为什么
          • @Andy:如果您尝试这行代码(在终端或脚本中):echo>file; for i in file; do md5=($(md5sum file)); echo $md5; done - 它应该输出68b329da9893e34099c7d8ad5cb9c940
          • 为什么echo ($(echo -n foo | md5sum)) 不起作用?出错bash: syntax error near unexpected token $(echo -n foo | md5sum)'
          • @lkraav:command echo -n foo | md5sum 输出 2 个 shell wordsstdoutacbd18db4cc2f85cedef654fccc4a4d8 和 @987654332 @(- 表示源为 stdin)。 – 您必须告诉 bash 使用 Command Substitution 将这些 单词 捕获到一个字符串中:$( command )。 – ( 括号 ) 产生一个具有 2 个元素的 bash 数组。但是,您必须将该数组构造 ( … ) 分配给变量名;因此,使用 md5 作为数组名称:md5=($(echo -n foo | md5sum))。您尚未将数组分配给变量名
          • 这是一个 bash 问题,但请注意这在 zsh 中不起作用。相反,您可以echo $md5[1] 仅获取哈希(但这不能移植到 bash)...
          【解决方案7】:

          一种方式:

          set -- $(md5sum $file)
          md5=$1
          

          另一种方式:

          md5=$(md5sum $file | while read sum file; do echo $sum; done)
          

          另一种方式:

          md5=$(set -- $(md5sum $file); echo $1)
          

          (除非你非常勇敢并且擅长使用反斜杠,否则不要尝试使用反引号。)

          与其他解决方案相比,这些解决方案的优势在于它们只调用md5sum 和shell,而不是其他程序,例如awksed。那么这是否真的重要是一个单独的问题;您可能很难注意到差异。

          【讨论】:

          • 这个问题被标记为 Bash,但可能表明其中有多少是 Bash 特定的(例如,它是否可以在 Z shell 中工作(现在据称是 默认 shell i>macOS v10.15 (Catalina) 及更高版本))。
          【解决方案8】:

          使用AWK

          md5=`md5sum ${my_iso_file} | awk '{ print $1 }'`
          

          【讨论】:

          • md5=`md5sum < ${my_iso_file}` 但是这仍然在最后输出“ - ”。但是对于比较来说,这应该足够了。
          • 错误它在 Mac 上给出以下输出 MD5 (/Users/hello.txt) = 24811012be8faa36c8f487bbaaadeb71 并且您的代码返回 MD5
          • 您可以通过在代码末尾添加| awk '{print $1}' 来运行- => md5sum < ${my_iso_file} | awk '{print $1}' @ChristopheDeTroyer
          【解决方案9】:

          您可以使用cut 以空格分隔行并仅返回第一个此类字段:

          md5=$(md5sum "$my_iso_file" | cut -d ' ' -f 1)
          

          【讨论】:

          • @CzarekTomczak 是的,但只需使用此答案的方法,您就可以通过更改命令本身来使用不同的散列算法重用它。 md5sum -> sha256sum 不记得你需要“剪切”多少字符。
          【解决方案10】:

          如果需要打印而不需要换行,可以使用:

          printf $(md5sum filename)
          

          【讨论】:

            【解决方案11】:
            md5="$(md5sum "${my_iso_file}")"
            md5="${md5%% *}" # remove the first space and everything after it
            echo "${md5}"
            

            【讨论】:

            • 不错。注意——在第一行,$() 周围不需要引号(尽管它们没有害处),但${} 周围肯定需要引号。
            • @Roman:是的,我倾向于习惯性地引用任何扩展名(除非有理由不这样做)——这比跟踪可以安全跳过引号的情况更容易。 (尽管在这种情况下,我将它们从实际文件名中删除...等待编辑。)
            【解决方案12】:
            md5=$(md5sum < $file | tr -d ' -')
            

            【讨论】:

              【解决方案13】:
              md5=`md5sum ${my_iso_file} | cut -b-32`
              

              【讨论】:

                【解决方案14】:

                在 Mac OS X 上:

                md5 -q file
                

                【讨论】:

                • 不适用于我的 Mac OS X 10.7。但是感谢您的发布,无论它适用于哪个版本。
                • 它在 11.5.2 版本上对我有用,但在删除 -q 选项后
                • md5md5sum 不同,这是 OP 询问的。
                【解决方案15】:
                md5=$(md5sum < index.html | head -c -4)
                

                【讨论】:

                  【解决方案16】:

                  另一种方式:

                  md5=$(md5sum ${my_iso_file} | sed '/ .*//' )
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-11-27
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-05-26
                    相关资源
                    最近更新 更多