2016-05-26 2 views
1

Я просто импортировал кучу изображений и понял, что есть 3 копии каждого изображения, но они называются последовательно.Powershell: Удалить каждый n файлов

В основном эти три файла одинаковы:

P5240901.dng 
P5240902.dng 
P5240903.dng 

и что в течение примерно 1600 снимков.

Я искал в написании простого сценария PowerShell (я использую Windows), который заглянет в каталог этих файлов и сохранит один файл из трех, просто перейдя через ряд файлов. Я не нашел что-то, что касалось символа «P» перед моим файлом, и я не знаком с языком PowerShell.

Любые идеи? Спасибо!

ответ

0

Предполагая, что все в директории следует за именовании & в наборе 3 что-то вроде этого должно работать:

$mydir = 'C:\path\to\files' 
[int]$idx = 1 
get-childitem $mydir|sort-object {$_.Name} |foreach-object{ 
    if ($idx % 3 -ne 1){ #get the modulus 
     $_ |remove-item 
    } 
    $idx++ 
} 
+0

Как это изменить, чтобы начать стирание с определенного имени файла? Например, у меня есть много других фотографий в моей папке, у которых нет этой проблемы, поэтому я хочу только стереть с P5240901.dng на P5240999.dng. –

+0

вы можете использовать совпадение так: 'get-childitem $ mydir | where-object {$ _. Name -match "P52409 *"} | sort-object {$ _. Name} | foreach-object {', или, альтернативно, разделите строку имени в определенную точку и произведите ее как целое, чтобы увидеть, находится ли она в определенном диапазоне. – JMP

0

Попробуйте следующее, который будет держать только 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-го.
  • Любые другие файлы остаются нетронутыми.

Объяснение:.

  • Group-Object { $_ -replace '^(.+)\d\.', '$1' }

    • эффективно группы входных файлов по части имени файла они разделяют (но только если они имеют все, кроме последнего символа, прежде чем расширение имени файла, и если этот символ является цифрой).
  • ? Count -gt 1

    • проходит только на тех группах, которые в результате имеют, по меньшей мере, 2 членов.
  • % { $_.Group[1..$($_.Group.Count)] }

    • обрабатывает файлы каждой группы, за исключением 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.

+0

Если я запускаю этот код на тестовую папку с фотографиями P5251500.dng в P5251520.dng , он дает: ... 00, ... 10 и ... 20. Как я могу управлять им, чтобы он удалял все, кроме элементов «n»? Очень полезное объяснение, хотя, спасибо! –

+0

@JulianHonma: Пожалуйста, см. Мое обновление. – mklement0

Смежные вопросы