基于哈希查找重复文件,保留Live Photos关联MOV文件的PowerShell脚本需求
基于哈希去重并保留Live Photo关联图片的PowerShell实现
完整脚本
# 替换为你的实际照片库路径 $photoPath = "C:\Your\Photo\Library\Path" # 遍历所有JPG,计算哈希并检查是否有同名MOV $jpgFiles = Get-ChildItem -Path $photoPath -Filter "*.jpg" -Recurse | ForEach-Object { [PSCustomObject]@{ Path = $_.FullName Hash = (Get-FileHash -Path $_.FullName -Algorithm SHA256).Hash HasMatchingMOV = Test-Path -Path "$($_.DirectoryName)\$($_.BaseName).mov" } } # 按哈希分组处理重复项 foreach ($group in $jpgFiles | Group-Object -Property Hash) { if ($group.Count -gt 1) { # 筛选出带对应MOV的图片 $keepFiles = $group.Group | Where-Object { $_.HasMatchingMOV } if ($keepFiles.Count -gt 0) { # 保留第一个带MOV的,删其他同哈希文件 $toDelete = $group.Group | Where-Object { $_.Path -ne $keepFiles[0].Path } } else { # 无MOV的重复组,保留第一个,删剩下的 $toDelete = $group.Group | Select-Object -Skip 1 } # 先预览要删除的文件(-WhatIf仅打印操作,确认无误后去掉该参数) $toDelete | Remove-Item -Force -WhatIf } }
关键逻辑说明
- 哈希校验:用SHA256哈希值判定图片内容是否重复,彻底解决文件名不同但内容一致的重复识别问题。
- Live Photo检测:自动检查同目录下是否存在与JPG同名的.MOV文件,标记为优先保留对象。
- 重复项处理规则:
- 同一哈希组内有带MOV的图片时,仅保留第一个符合条件的文件,删除其余同哈希文件。
- 无对应MOV的重复组,默认保留最先遍历到的文件,删除剩余重复项。
- 安全机制:默认启用
-WhatIf参数,运行时只会输出待删除文件路径,不会实际执行删除操作。确认列表无误后,再移除该参数执行真实删除。
注意事项
- 操作前务必备份照片库,避免意外损失。
- 若你的MOV文件为大写后缀(
.MOV),给Test-Path添加-CaseSensitive参数即可匹配。 - 如需更快的哈希计算速度,可将
Get-FileHash中的SHA256替换为MD5,但SHA256的哈希碰撞概率更低,安全性更高。
内容的提问来源于stack exchange,提问作者user29012922
相关产品推荐
相关产品推荐

