Попробуйте следующее, который будет держать только 1-ый файл в каждой группе файлов, имена которых одинаково для последнего символа перед расширением имени файла, за исключением, если предположить, что символ является цифрой (синтаксис предполагает PSv3 +):
'P5240901.dng', 'P5240902.dng', 'P5240903.dng', 'A1.dng', 'A2.dng', 'singleton.dng' |
Group-Object { $_ -replace '^(.+)\d\.', '$1' } |
? Count -gt 1 |
% { $_.Group[1..$($_.Group.Count)] }
выходы:
P5240902.dng
P5240903.dng
A2.dng
Заменить входной массив образца с вызовом Get-ChildItem -File
и Prepend Remove-Item
к $_.Group[1..$($_.Group.Count)]
выполнить фактическое удаление.
Приведенная выше команда использует строку массив с входом имена файлов, но выход [System.IO.FileInfo]
экземпляры по Get-ChildItem
будет эффективно действовать так же в контексте строки: они будут расширяться до их соответствующих имен файлов.
Преимущества этого решения заключается в том, что он не зависит от входных файлов, появляющихся строго в группах 3:
- Любой группа входного обмена файлов такое же имя цифры перед расширением имени файла, за исключением который имеет по крайней мере 2 члена (и любое число за пределами этого), будет иметь каждого члена, кроме 1-го.
- Любые другие файлы остаются нетронутыми.
Объяснение:.
Update: Вот вариант запроса поздними комментариями Op в: Ниже, приведены входные имена файлов, таких как P5240901.dng, P5240902.dng, ..., P5240910.dng, P5240911.dng, ..., P5240990.dng, P5240991.dng, ..., P5240999.dng
, рассмотрим каждую группу файлов группы (на основе на десятки месте), и в каждой группе только сохранить 1-ый файл:
1..99 | % { "P52409$('{0:00}' -f $_).dng" } |
Group-Object { $_ -replace '^(.+\d)\d\.', '$1' } |
? Count -gt 1 |
% { $_.Group[1..$($_.Group.Count)]}
выходы:
# tens place of 0; skips ...01.dng
P5240902.dng
P5240903.dng
... # up to ...09.dng
# tens place of 1; skips ...10.dng
P5240911.dng
P5240912.dng
... # skips ...20.dng, ...30.dng, ...
# tens place of 9; skips ...90.dng
P5240991.dng
P5240992.dng
...
P5240999.dng
Для того, чтобы передавать только файлы, представляющие интерес для команды, замените входной массив образца с
Get-ChildItem P52515[0-9][0-9].dng
.
Как это изменить, чтобы начать стирание с определенного имени файла? Например, у меня есть много других фотографий в моей папке, у которых нет этой проблемы, поэтому я хочу только стереть с P5240901.dng на P5240999.dng. –
вы можете использовать совпадение так: 'get-childitem $ mydir | where-object {$ _. Name -match "P52409 *"} | sort-object {$ _. Name} | foreach-object {', или, альтернативно, разделите строку имени в определенную точку и произведите ее как целое, чтобы увидеть, находится ли она в определенном диапазоне. – JMP