根据哈希查找重复文件,使用catch

问题描述 投票:0回答:1

我有一个照片库,其中包含很多重复的图像。不幸的是,这些有时有不同的名称,因为它们也来自我妻子的电话,编号不同。

在 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

不知道如何离开这里。

powershell hash filenames
1个回答
0
投票

“所以我想要的是根据哈希扫描重复文件,然后确保如果存在具有相同基名的 .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
© www.soinside.com 2019 - 2024. All rights reserved.