powershell - 如何删除具有相似名称的重复文件
问题描述
我对 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
}
解决方案
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
通用参数 预览操作。一旦你确定它会做你想做的事,就删除它。
推荐阅读
- delphi - 从基类delphi中释放超类对象
- android-studio - Android Studio 更改了我的文档根目录。我可以改回来吗?
- html - 如何在我之后使一条线在中间
对齐 - javascript - 使用 cookie JQuery 存储数组列表
- c# - WPF C# XAML 动画
- android - 具有数据绑定的约束布局无响应
- python - 使用python模糊图像部分的最优雅方法是什么?
- json - 如何添加对不和谐 webhook 有效负载的反应
- python - 自动化比较数据框的多列并将数据存储到新列中的过程
- php - laravel - 单选按钮/复选框将错误的值传递给数据库