Назад | Перейти на главную страницу

Powershell удаление файлов с помощью регулярных выражений

У меня в папке несколько тысяч файлов разных ревизий.

ACZ002-0.p
ACZ002-1.p
ACZ002-2.p
ACZ051-0.p
ACZ051-1.p
...

Версия всегда - это последняя цифра перед точкой. Мне нужно сохранить только файлы с последней версией, но я не знаю, как продолжить работу с кодом.

$path = "E:\Export\"
$filter = [regex] "[A-Z]{3}[0-9]{3}\-[0-9]{1,2}\.(p)"
$files = Get-ChildItem -Path $path -Recurse | Where-Object {($_.Name -match $filter)}

Вероятно, есть способ сделать это лучше, но вот что я сначала подумал, чтобы это сделать; этот подход использует именованные группы захвата в регулярном выражении, чтобы упростить для PowerShell сортировку и группировку по базовому имени файла и ревизии. Последняя переменная $ filesToKeep будет массивом объектов FileInfo, которые вы можете исключить из своей команды удаления. Конечно, я рекомендую провести много тестов, прежде чем что-либо удалять.

$filter = [regex] "(?<baseName>[A-Za-z]{3}[0-9]{3})\-(?<revision>[0-9]+)\.p"
$results = ls c:\temp -Recurse | where {$_.Name -match $filter} | foreach-object {
    new-object PSObject -Property @{
        BaseName = $matches.BaseName
        Revision = $matches.Revision
        File = $_
    }
}
$filesToKeep = $results | sort basename, revision  -Descending | group basename | ForEach-Object { $_.group | select -first 1 -ExpandProperty File}