首页 > 解决方案 > 如何删除具有相似名称的重复文件

问题描述

我对 PowerShell 还很陌生,我无法为我的问题找到明确的答案。我在不同的文件夹中有一堆 excel 文件,这些文件是重复的,但由于它们正在更新而具有不同的文件名。例如 015 批准的保修 - 土耳其 - Case-2019 08-1437015(第 3 期),015 批准的保修 - 土耳其 - Case-2019 08-1437015(最后一期) 015 批准的保修 - 土耳其 - Case-2019 08-1437015 015 批准的保修 -土耳其 - Case-2019 08-1437015 已修改

我尝试了不同的方法,但现在我知道过滤文件的最简单方法,但不知道语法。锚点将是日期之后的案例编号。我想将案例编号相互比较,只保留最新的(按修改日期)并删除其余的。任何指导表示赞赏。

#take files from folder
$dupesource = 'C:\Users\W_Brooker\Documents\Destination\2019\08'

#filter files by case number (7 digit number after date)
$files = Get-ChildItem $dupesource -Filter "08-aaaaaaa"

#If case number is the same keep newest file delete rest
foreach ($file in $files){
$file | Delete-Item - sort -property Datemodified |select -Last 1
}

标签: powershellfileduplicatesdelete-file

解决方案


PowerShell 惯用的解决方案是:

  • 在单个管道中组合多个 cmdlet,

  • 其中Group-Object提供了按文件名中的共享案例编号对重复文件进行分组的核心功能:

# Define the regex that matches a case number:
# A 7-digit number embedded in filenames that duplicates share.
$regex = '\b\d{7}\b' 

# Enumerate all files and select only those whose name contains a case number.
Get-ChildItem -File $dupesource | Where-Object { $_.BaseName -match $regex } | 
  # Group the resulting files by shared embedded case number.
  Group-Object -Property { [regex]::Match($_.BaseName, $regex).Value } |
    # Process each group:
    ForEach-Object {
      # In each group, sort files by most recently updated first.
      $_.Group | Sort-Object -Descending LastWriteTimeUtc |
        # Skip the most recent file and delete the older ones.
        Select-Object -Skip 1 | Remove-Item -WhatIf
    }

-WhatIf通用参数 预览操作。一旦你确定它会做你想做的事,就删除它。


推荐阅读