Windows Powershell:从目录获取项目 -> 对它们进行 md5 计算 -> 按文件名对列表进行排序 -> 输出到文件

Windows Powershell:从目录获取项目 -> 对它们进行 md5 计算 -> 按文件名对列表进行排序 -> 输出到文件

有没有办法完全通过 Windows Poweshell 来模拟这个 unux 命令,而不是使用 WSL:

find ./<dir1>/ -type f -exec md5sum {} + | sort -k 2 > dir1_hashes.md 

我需要比较本地(Windows)和远程(macos)机器上的两个大目录,但不知何故我无法得到它,因为在 Windows 上我总是得到一个以不同于 unix 排序方式排序的哈希列表。

更新:应用 harrymc 版本后的结果:

Mac 机:md5deep -rl ./untitled | sort -k 2

18abf3022eb572c21dc8d409b815424f  ./untitled/140301_114703.dng
22b2f3f71d7d18df04a4538ce6e9d771  ./untitled/140301_125241.dng
45d14f611dc31842b9c508668416cc58  ./untitled/140301_171617.dng
9239cbbce1090ec1e29de8b3ef1766af  ./untitled/140301_172922.dng
a54610821d408e1e0602f3c1c819ff3d  ./untitled/171118_203747.NEF
89aa63b14f023899d434bbd6a240af49  ./untitled/171118_203747.xmp
7ae0266bbe3575995b54a9cb85f922a5  ./untitled/171118_203919.NEF
fd5ace6d3932ddf262f54d5cac3141f9  ./untitled/171118_203919.xmp
9e9c73648c25d3beaff7da5d3842a375  ./untitled/171118_203949-2.jpg
8a8af2f9f7f657318dd7652a9dfdb686  ./untitled/171118_203949.NEF
8bb798f91842ae2f30bf39faf2ca36af  ./untitled/171118_203949.jpg
3a72150749645d7a115acb1ac5661159  ./untitled/171118_203949.xmp
8af598488c25a626a02bdb4b9a84fbe6  ./untitled/171118_204022.NEF
a2b71a1a77f6b0a6604dc91cdec94386  ./untitled/171118_204022.xmp
3798d51ee99b65ff9d3b96c3d0636ebf  ./untitled/171118_204349.xmp
777ae717eb3c4840ab5c9fef81bbe92a  ./untitled/171118_204617-2.jpg

Windows 机器:Get-ChildItem "./untitled" -Recurse -Force -File | Get-FileHash -Algorithm md5 | Sort-Object -Property 'Path' | Select-Object -Property Hash, Path

Hash                             Path
----                             ----
18ABF3022EB572C21DC8D409B815424F E:\TEMP\untitled\140301_114703.dng
22B2F3F71D7D18DF04A4538CE6E9D771 E:\TEMP\untitled\140301_125241.dng
45D14F611DC31842B9C508668416CC58 E:\TEMP\untitled\140301_171617.dng
9239CBBCE1090EC1E29DE8B3EF1766AF E:\TEMP\untitled\140301_172922.dng
A54610821D408E1E0602F3C1C819FF3D E:\TEMP\untitled\171118_203747.NEF
89AA63B14F023899D434BBD6A240AF49 E:\TEMP\untitled\171118_203747.xmp
7AE0266BBE3575995B54A9CB85F922A5 E:\TEMP\untitled\171118_203919.NEF
FD5ACE6D3932DDF262F54D5CAC3141F9 E:\TEMP\untitled\171118_203919.xmp
8BB798F91842AE2F30BF39FAF2CA36AF E:\TEMP\untitled\171118_203949.jpg
8A8AF2F9F7F657318DD7652A9DFDB686 E:\TEMP\untitled\171118_203949.NEF
3A72150749645D7A115ACB1AC5661159 E:\TEMP\untitled\171118_203949.xmp
9E9C73648C25D3BEAFF7DA5D3842A375 E:\TEMP\untitled\171118_203949-2.jpg
8AF598488C25A626A02BDB4B9A84FBE6 E:\TEMP\untitled\171118_204022.NEF
A2B71A1A77F6B0A6604DC91CDEC94386 E:\TEMP\untitled\171118_204022.xmp
3798D51EE99B65FF9D3B96C3D0636EBF E:\TEMP\untitled\171118_204349.xmp
777AE717EB3C4840AB5C9FEF81BBE92A E:\TEMP\untitled\171118_204617-2.jpg

您可以注意到,当文件名相同时,排序算法的工作方式不同。

另一个 Windows 版本: Get-FileHash "./untitled/*" -Algorithm md5 | Sort-Object -Property 'Path' | Select-Object -Property Hash, Path

但排序结果是一样的:

Hash                             Path
----                             ----
18ABF3022EB572C21DC8D409B815424F E:\TEMP\untitled\140301_114703.dng
22B2F3F71D7D18DF04A4538CE6E9D771 E:\TEMP\untitled\140301_125241.dng
45D14F611DC31842B9C508668416CC58 E:\TEMP\untitled\140301_171617.dng
9239CBBCE1090EC1E29DE8B3EF1766AF E:\TEMP\untitled\140301_172922.dng
A54610821D408E1E0602F3C1C819FF3D E:\TEMP\untitled\171118_203747.NEF
89AA63B14F023899D434BBD6A240AF49 E:\TEMP\untitled\171118_203747.xmp
7AE0266BBE3575995B54A9CB85F922A5 E:\TEMP\untitled\171118_203919.NEF
FD5ACE6D3932DDF262F54D5CAC3141F9 E:\TEMP\untitled\171118_203919.xmp
8BB798F91842AE2F30BF39FAF2CA36AF E:\TEMP\untitled\171118_203949.jpg
8A8AF2F9F7F657318DD7652A9DFDB686 E:\TEMP\untitled\171118_203949.NEF
3A72150749645D7A115ACB1AC5661159 E:\TEMP\untitled\171118_203949.xmp
9E9C73648C25D3BEAFF7DA5D3842A375 E:\TEMP\untitled\171118_203949-2.jpg
8AF598488C25A626A02BDB4B9A84FBE6 E:\TEMP\untitled\171118_204022.NEF
A2B71A1A77F6B0A6604DC91CDEC94386 E:\TEMP\untitled\171118_204022.xmp
3798D51EE99B65FF9D3B96C3D0636EBF E:\TEMP\untitled\171118_204349.xmp
777AE717EB3C4840AB5C9FEF81BBE92A E:\TEMP\untitled\171118_204617-2.jpg

upd2:无论如何,很明显我无法区分文件,因为 Get-FileHash 对象为我提供了不同的格式。好吧,我将在 Windows 机器上使用 md5deep64,格式将相同,我有它。但无论如何,罪魁祸首是 Windows 排序。首先,现在我不知道如何按第二列(文件路径)排序,但似乎我们可以解决它,但其次,我不知道如何让 Windows 排序以与 Unix 排序相同的方式处理相同的文件名。而且我现在仍然不知道如何摆脱它。

答案1

这应该可以做到:

Get-ChildItem -path "C:\path\input-folder" -Recurse -Force -File | 
  Get-FileHash | 
  Sort-Object -Property 'Path' |
  Select-Object -Property Path,Hash | Out-File "C:\path\outputfile.txt

参考 :

答案2

你可以试试:

# Get screen output  
$(cd "E:\TEMP\untitled\" ; gci . *.* -re | Get-FileHash -Algorithm md5) | % { Write-Host $(($_.hash).ToLower()+"  "+('.'+($_.Path).replace("\","/").Substring(7)))}

# Save output to file
$(cd "E:\TEMP\untitled\" ; gci . *.* -re | Get-FileHash -Algorithm md5) | % { $str=$(($_.hash).ToLower()+"  "+('.'+($_.Path).replace("\","/").Substring(7))) ; $str >>.\outputfile.txt }
  • 输出:
0a4185ca0a4a6352417d92bb14f7db2b  ./untitled/140301_114703.dng
38d5fbe2ca5d5bcf0290ba97fd232b5f  ./untitled/140301_125241.dng
0d460302f696d59ea133bd77c95f130c  ./untitled/140301_171617.dng
e2bef7514db1a33da1e29471a1b4c144  ./untitled/140301_172922.dng
3ed6937c8e0629ddec75c17282e06879  ./untitled/171118_203747.NEF
0d8fc91bbbac11d099cfcba989494307  ./untitled/171118_203747.xmp
3f394ba590f8820625e3ce29bb944510  ./untitled/171118_203919.NEF
6a993d3c75acb92e85c1fd72d3792724  ./untitled/171118_203919.xmp
21b23631620ec10feefe4f149e518357  ./untitled/171118_203949-2.jpg
bc462e2f6738546c7319de05707055d9  ./untitled/171118_203949.jpg
14420b9271c7e697f64050767ed1ca29  ./untitled/171118_203949.NEF
51bdec0fc7fc957d6ea203ea60a41bcb  ./untitled/171118_203949.xmp
35ae5d18b7bb6fbee5ef7deccb47b69d  ./untitled/171118_204022.NEF
df64b52d65d8fd83e60abb7b89790b3a  ./untitled/171118_204022.xmp
d84e53c2486cd713f0da23368a1e3cfa  ./untitled/171118_204349.xmp
22c3f84432dc90ad5261b1ceef98fc24  ./untitled/171118_204617-2.jpg

答案3

我认为这可以满足您的要求,无需任何Substring魔法。重要的部分是:

  • -Culture en-US-POSIX使用指定的文化对名称进行排序(查看Get-Culture -ListAvailable并选择与您的 macOS 匹配的名称),
  • 哈希和文件路径作为单个字符串返回,并由 TAB 字符 ( ) 分隔`t,如果单个 TAB 不够用,您可以将其更改为所需的任何内容,
  • 哈希被转换为小写以匹配md5sum
  • Resolve-Path命令将绝对路径转换为相对于当前目录的路径,
  • Replace将 Windows 路径分隔符更改为 *nix,
  • 通过不使用,Select-Object我们就没有不必要的属性标题和分隔线。

它适用于 Windows PowerShell 5.1 和 PowerShell 7(已在 7.4.1 中尝试)。

cd C:\
Get-ChildItem ./Windows/System32/Com -File | `
Get-FileHash -Algorithm MD5 | `
Sort-Object -Property Path -Culture en-US-POSIX | `
% { "$($_.Hash.ToLower())`t$((Resolve-Path -Relative $_.Path).Replace('\', '/'))" }

05ed9d45b0368c5b6cb9f3fd3835d13e        ./Windows/System32/Com/comadmin.dll
00ab67c41039ee2c7ecc1cdb6eb39a7c        ./Windows/System32/Com/comempty.dat
920731b00424e33934ad8bb4a923cfe1        ./Windows/System32/Com/comrepl.exe
86b96422a58603b6419c1b8173241fed        ./Windows/System32/Com/MigRegDB.exe
d06cd0b0424c877a3ea93ed42130d5ee        ./Windows/System32/Com/mtsadmin.tlb

相关内容