Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >在Windows上重新创建linux md5校验和

在Windows上重新创建linux md5校验和
EN

Stack Overflow用户
提问于 2021-09-14 08:29:08
回答 2查看 217关注 0票数 0

我正在对我们的linux机器执行一些非常简单的校验和,但现在我需要为我们的windows用户重新创建一些类似的校验和。要给我一个校验和,我只需运行:

代码语言:javascript
代码运行次数:0
复制
md5sum *.txt | awk '{ print $1 }' | md5sum

我正在努力在Windows中重新创建它,无论是使用批处理文件还是Powershell。我得到的最接近的是:

代码语言:javascript
代码运行次数:0
复制
Get-ChildItem $path -Filter *.txt | 
Foreach-Object {
   $hash =  Get-FileHash -Algorithm MD5 -Path ($path + "\" + $_) | Select -ExpandProperty "Hash"
   $hash = $hash.tolower()  #Get-FileHash returns checksums in uppercase, linux in lower case (!)
   Write-host $hash
}

这将向控制台输出与linux命令相同的每个文件的校验和结果,但是通过管道将其返回到Get-FileHash以获得与linux等效项匹配的单个输出,这让我难以理解。写入文件会让我遇到回车差异问题

以字符串的形式流回Get-FileHash不会返回相同的校验和:

代码语言:javascript
代码运行次数:0
复制
$String = Get-FileHash -Algorithm MD5 -Path (Get-ChildItem -path $files -Recurse) | Select -ExpandProperty "Hash"
$stringAsStream = [System.IO.MemoryStream]::new()
$writer = [System.IO.StreamWriter]::new($stringAsStream)
$writer.write($stringAsStream)
Get-FileHash -Algorithm MD5 -InputStream $stringAsStream

我是不是过度设计了?我相信这不应该这么复杂!提亚

EN

回答 2

Stack Overflow用户

发布于 2021-09-14 09:02:51

您需要在从Get-FileHash返回的对象上引用.Hash属性。如果您想要一个类似于md5hash的视图,您也可以使用Select-Object来管理:

代码语言:javascript
代码运行次数:0
复制
# Get filehashes in $path with similar output to md5sum
$fileHashes = Get-ChildItem $path -File | Get-FileHash -Algorithm MD5

# Once you have the hashes, you can reference the properties as follows
# .Algorithm is the hashing algo
# .Hash is the actual file hash
# .Path is the full path to the file
foreach( $hash in $fileHashes ){
  "$($hash.Algorithm):$($hash.Hash) ($($hash.Path))"
}

对于$path中的每个文件,上面的foreach循环将生成如下所示的行:

代码语言:javascript
代码运行次数:0
复制
MD5:B4976887F256A26B59A9D97656BF2078 (C:\Users\username\dl\installer.msi)

根据您选择的散列算法和文件系统,算法、散列和文件名显然会有所不同。

票数 0
EN

Stack Overflow用户

发布于 2021-09-15 10:51:49

问题的关键在于细节:

  • (已知) Get-FileHash以大写形式返回校验和,而Linux md5sum以小写形式(!)返回;
  • FileSystem提供者的筛选器*.txt在PowerShell中不区分大小写,而在Linux中则取决于选项nocaseglob。如果设置为(shopt -s nocaseglob),则在执行文件名扩展时,Bash以不区分大小写的方式匹配文件名。否则,(shopt -u nocaseglob),文件名匹配是case-sensitive;
  • Order:Get-ChildItem输出根据Unicode collation algorithm排序,而在Linux中,*.txt过滤器按照LC_COLLATE类别(在我的系统上是LC_COLLATE="C.UTF-8")的顺序展开。

在以下(部分注释的)脚本中,三个# Test代码块演示了最终解决方案的调试步骤:

代码语言:javascript
代码运行次数:0
复制
Function Get-StringHash {
    [OutputType([System.String])]
    param(
        # named or positional: a string
        [Parameter(Position=0)]
        [string]$InputObject
    )
    $stringAsStream = [System.IO.MemoryStream]::new()
    $writer = [System.IO.StreamWriter]::new($stringAsStream)
    $writer.write( $InputObject)
    $writer.Flush()
    $stringAsStream.Position = 0
    Get-FileHash -Algorithm MD5 -InputStream $stringAsStream |
        Select-Object -ExpandProperty Hash
    $writer.Close()
    $writer.Dispose()
    $stringAsStream.Close()
    $stringAsStream.Dispose()
}

function ConvertTo-Utf8String {
    [OutputType([System.String])]
    param(
        # named or positional: a string
        [Parameter(Position=0, Mandatory = $false)]
        [string]$InputObject = ''
    )
    begin {
        $InChars  = [char[]]$InputObject
        $InChLen  = $InChars.Count
        $AuxU_8 = [System.Collections.ArrayList]::new()
    }
    process {
        for ($ii= 0; $ii -lt $InChLen; $ii++) {
            if ( [char]::IsHighSurrogate( $InChars[$ii]) -and
                    ( 1 + $ii) -lt  $InChLen             -and
                    [char]::IsLowSurrogate( $InChars[1 + $ii]) ) {
                $s = [char]::ConvertFromUtf32(
                     [char]::ConvertToUtf32( $InChars[$ii], $InChars[1 + $ii]))
                $ii ++
            } else {
                $s = $InChars[$ii]
            }
            [void]$AuxU_8.Add( 
                ([System.Text.UTF32Encoding]::UTF8.GetBytes($s) | 
                    ForEach-Object { '{0:X2}' -f $_}) -join ''
            )
        }
    }
    end { $AuxU_8 -join '' }
}

# Set variables
$hashUbuntu = '5d944e44149fece685d3eb71fb94e71b'
$hashUbuntu   <# copied from 'Ubuntu 20.04 LTS' in Wsl2:
              cd `wslpath -a 'D:\\bat'`
              md5sum *.txt | awk '{ print $1 }' | md5sum | awk '{ print $1 }'
              <##>
$LF = [char]0x0A   # Line Feed (LF)
$path = 'D:\Bat'   # testing directory


$filenames = 'D:\bat\md5sum_Ubuntu_awk.lst'
<# obtained from 'Ubuntu 20.04 LTS' in Wsl2:
    cd `wslpath -a 'D:\\bat'`
    md5sum *.txt | awk '{ print $1 }' > md5sum_Ubuntu_awk.lst
    md5sum md5sum_Ubuntu_awk.lst | awk '{ print $1 }' # for reference
<##>

# Test #1: is `Get-FileHash` the same (beyond character case)?
$hashFile = Get-FileHash -Algorithm MD5 -Path $filenames |
                Select-Object -ExpandProperty Hash
$hashFile.ToLower() -ceq $hashUbuntu

# Test #2: is `$stringToHash` well-defined? is `Get-StringHash` the same?
$hashArray = Get-Content $filenames -Encoding UTF8
$stringToHash = ($hashArray -join $LF) + $LF
(Get-StringHash -InputObject $stringToHash) -eq $hashUbuntu 

# Test #3: another check: is `Get-StringHash` the same?
Push-Location -Path $path
$filesInBashOrder = bash.exe -c "ls -1 *.txt"
$hashArray = $filesInBashOrder |
    Foreach-Object {
        $hash = Get-FileHash -Algorithm MD5 -Path (
                        Join-Path -Path $path -ChildPath $_) |
                    Select-Object -ExpandProperty "Hash"
        $hash.tolower()
    }
$stringToHash = ($hashArray -join $LF) + $LF
(Get-StringHash -InputObject $stringToHash) -eq $hashUbuntu
Pop-Location

# Solution - ordinal order assuming `LC_COLLATE="C.UTF-8"` in Linux
Push-Location -Path $path
$hashArray = Get-ChildItem -Filter *.txt -Force -ErrorAction SilentlyContinue |
    Where-Object {$_.Name -clike "*.txt"} | # only if `shopt -u nocaseglob`
    Sort-Object -Property { (ConvertTo-Utf8String -InputObject $_.Name) } |
    Get-FileHash -Algorithm MD5 |
        Select-Object -ExpandProperty "Hash" |
    Foreach-Object {
        $_.ToLower()
    }
$stringToHash = ($hashArray -join $LF) + $LF
(Get-StringHash -InputObject $stringToHash).ToLower() -ceq $hashUbuntu
Pop-Location

输出(在278个文件上测试):.\SO\69181414.ps1

代码语言:javascript
代码运行次数:0
复制
5d944e44149fece685d3eb71fb94e71b
True
True
True
True
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69181414

复制
相关文章
lucene如何返回所有数据
我们在实际使用lucene的过程中,筛选多个条件时BooleanQuery这个类来实现,比如下面代码:
johnhuster的分享
2022/03/29
7110
如何利用CDO从数据集中提取数据
之前说了如何利用CDO查看数据集信息 使用CDO查看气象数据信息。这一次说一下利用CDO从数据集中提取数据。这部分是非常使用的,尤其是当涉及到大数据集的时候,其优势就变得非常明显了。
bugsuse
2020/04/21
8.8K0
如何利用CDO从数据集中提取数据
数据库的方向 - 行vs列
前言: 转载的好文不多,但此篇的确是难得一见的好文,如若不信,请仔细阅读。 此篇文章没有波涛汹涌的起伏,没有繁多的代码,只有悠然自得的文笔。 因此,分享此文给大家。 翻译原文链接:https://ww
谙忆
2021/01/21
1.1K0
数据库的方向 - 行vs列
从Bert预训练数据集中获取词向量
在一些操作过程中,经常要获取词向量,BERT做为一个在各项评测指标中都比较出色的,且提供了许多预训练模型的,从其中获取词向量是一些任务中必备的操作。
sparkexpert
2019/08/23
4.5K0
从Bert预训练数据集中获取词向量
Pandas DataFrame显示行和列的数据不全
pd.set_option('display.max_columns', None)
用户7886150
2020/12/26
6.7K0
FPGA计算3行同列数据之和
本文介绍了如何利用FPGA实现Sobel边缘检测算法,通过仿真实验证明该方法可以大幅提高边缘检测的实时性,从而在嵌入式系统中得到广泛应用。
NingHeChuan
2018/01/05
1.4K0
FPGA计算3行同列数据之和
从xlnet预训练数据集中获取词向量
利用pytorch-transformers中的方法进行预训练模型加载,然后进行词向量的获取和提取。
sparkexpert
2019/08/23
1.5K0
从xlnet预训练数据集中获取词向量
数据库行存储及列存储详解
本文参见:https://blog.csdn.net/Xingxinxinxin/article/details/80939277
全栈程序员站长
2022/09/06
2.7K0
数据库行存储及列存储详解
SAS数据集中一行与多行的比较
前几天看到一个群友提的一个问题:求上图中X小于等于所有Y值的个数。比如,第一个Y为0,则5个X中小于等于0的个数为0。实现这一目的的方法有多种,最易懂的方法应该是转置加数组,下面介绍其他两种方法:
专业余码农
2020/07/16
1.4K0
SAS数据集中一行与多行的比较
pandas数据清洗-删除没有序号的所有行的数据
pandas数据清洗-删除没有序号的所有行的数据 问题:我的数据如下,要求:我想要的是:有序号的行留下,没有序号的行都不要 图片 【代码及解析】 import pandas as pd filepath="E:/yhd_python/pandas.read_excel/student.xlsx" df=pd.read_excel(filepath,sheet_name='Sheet1',skiprows=1) df.tail() 先导入pands包,用read_excel读取文件,工作
哆哆Excel
2022/10/31
1.6K0
聊一聊数据库的行存与列存
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/07/26
1.7K0
聊一聊数据库的行存与列存
列存储、行存储
Sybase在2004年左右就推出了列存储的Sybase IQ数据库系统,主要用于在线分析、数据挖掘等查询密集型应用。列存储,缩写为DSM,相对于NSM(N-ary storage model),其主要区别在于:
全栈程序员站长
2022/09/14
7.9K0
列存储、行存储
ECharts数据集( dataset )的行或列映射为系列(series)
用户可以使用 seriesLayoutBy 配置项,改变图表对于行列的理解。seriesLayoutBy 可取值:
别团等shy哥发育
2023/02/25
1.1K0
ECharts数据集( dataset )的行或列映射为系列(series)
springmvc接收数据返回数据
1,当前端传递的参数名和方法形参名不一致时,通过@RequestParam指定转换关系
微醺
2019/01/17
1.5K0
Bootstrap行和列
在Bootstrap中,行(Row)和列(Column)是构建响应式网格布局的核心组件。它们允许我们创建灵活的网格系统,以便在不同的屏幕尺寸下进行布局。
堕落飞鸟
2023/05/17
2.1K0
从分散到集中,云南移动数据中心网络走上新征途
对于一家运营商来说,没什么比系统的高效稳定运行更重要了。对于云南移动信息技术部总经理于桃来说,自然同样如此。
IT创事记
2022/08/30
6540
从分散到集中,云南移动数据中心网络走上新征途
替换 VOC 数据集中图片路径
在一次做项目的时候,团队分配任务做数据集,用 labelimage 来打标,汇总数据时发现 xml 中的图片路径各不相同,于是就写了这个工具来修改 xml 中的图片路径。
HauHau
2022/01/12
1.6K0
用过Excel,就会获取pandas数据框架中的值、行和列
至此,我们已经学习了使用Python pandas来输入/输出(即读取和保存文件)数据,现在,我们转向更深入的部分。
fanjy
2021/11/29
19.2K0
用过Excel,就会获取pandas数据框架中的值、行和列
url从输入到页面返回数据经历了什么?
1>DNS解析可以理解为主寻找这个IP地址的过程,其中如果找到IP地址会进行本地缓存,以便下次继续使用
测试小兵
2019/07/22
8810
url从输入到页面返回数据经历了什么?
简单介绍数据采集中的数据埋点
每个人都会走路跑步,但是并不是人人都能成为专业的运动员那么出色。产品经理就是一种这样的职业,我们都可以站在产品的角度思考问题,但我们并不是都能够成为一名出色的产品经理。
木东居士
2019/02/28
2.6K0

相似问题

数据集中特定列的所有行

23

数据集中所有行的1列之和

33

从稀疏数据集中删除列和行

116

Excel,如何从数据集中返回特定行。

11

从数据集中复制符合条件的所有行

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档