我有一个照片库,其中包含很多重复的图像。不幸的是,这些有时有不同的名称,因为它们也来自我妻子的电话,编号不同。
在 IOS 上,有一种称为“实时照片”的东西,其中 .MOV 文件与图像具有相同的基本名称。我的照片库以 IOS 相同的方式显示这些内容(按住播放)。当然我想保留这个功能。
所以我想要的是根据哈希扫描重复文件,然后确保如果存在具有相同基名的 .MOV,则保留该文件并删除其他文件。
-a--- 10-8-2013 19:36 2909610 IMG_0992 (1).JPG
-a--- 10-8-2013 19:36 2909610 IMG_0992 (2).JPG
-a--- 10-8-2013 19:36 2909610 IMG_0992.JPG
-a--- 14-7-2013 16:30 30972837 IMG_0992.MOV
所以在这个例子中
IMG_0992.JPG
应该保留,其他的删除。
# start scanning here:
# (default to personal documents folder)
# use any other path if you like:
# i.e.: $Path = 'c:\windows'
$Path = "D:\Test"
# get a hashtable of all files of size greater 0
# grouped by their length:
$group = Get-ChildItem -Path $Path -File -Recurse -ErrorAction Ignore |
# EXCLUDE empty files...
Where-Object Length -gt 0 |
# group them by their LENGTH...
Group-Object -Property Length -AsHashTable
# take each pile in the hashtable (grouped by their length)
# and return all files from piles greater than one element:
$candidates = foreach($pile in $group.Values)
{
# are there at least 2 files in this pile?
if ($pile.Count -gt 1)
{
# yes, add it to the candidates
$pile
}
}
# these are files that CAN have duplicates and require more
# testing:
$candidates
$duplicates = $candidates |
# group all files by their hash, placing files with equal content
# in the same group
Group-Object -Property {
(Get-FileHash -Path $_.FullName -Algorithm SHA1).Hash
} -AsHashTable -AsString
$duplicates
不知道如何离开这里。
“所以我想要的是根据哈希扫描重复文件,然后确保如果存在具有相同基名的 .MOV,则保留该文件并删除其他文件。”
由于存在 MOV,我只会检查确实需要检查的文件,因此从列表中删除也具有 MOV 的 JPG 文件:
$jpgs = Get-ChildItem *.JPG
$movs = Get-ChildItem *.MOV
$jpgs | Where-Object { $_.BaseName -notin $movs.BaseName }
这会产生(基于您问题中的 4 个文件):
IMG_0992 (1).JPG
IMG_0992 (2).JPG