Как переименовать файлы, удалив все после определенного символа, но добавив суффикс (сброс счетчика при изменении префикса) - PullRequest
0 голосов
/ 24 октября 2019

У меня есть папка с файлами, названными так:

b56-m7s - 300_m_f.jpg

Мне нужно удалить каждый символ после и включая «-», чтобы новое имя было:

b56-m7s

Проблема в том, что несколько файлов будут иметь одинаковое имя, поэтому я надеялся добавить простой суффикс по возрастанию. Также, оптимально, восходящий суффикс сбрасывается каждый раз, когда изменяется базовое имя файла. как например:

b56-m7s(1)
b56-m7s(2)
b5j-i89(1)
b5j-i89(2)

и т. д.

Вот как я представляю некоторый код, но я не знаю, как добавить восходящий суффикс

 get-childitem *.jpg | foreach { rename-item $_ $_.Name.Replace(^[^ -]*, "") }

Заранее спасибо:)

Ответы [ 2 ]

1 голос
/ 24 октября 2019

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

get-childitem *.jpg | 
foreach {
  $prefix = $_.basename -replace ' - .*'
  if ($prefix -ne $oldprefix) { $i = 1 } # also true the first time
  rename-item $_.fullname "$prefix-$i.jpg" -whatif
  $i++
  $oldprefix = $prefix
}

What if: Performing the operation "Rename File" on target "Item: C:\users\js\foo\b56-m7s - 300_m_f.jpg Destination: C:\users\js\foo\b56-m7s-1.jpg".
What if: Performing the operation "Rename File" on target "Item: C:\users\js\foo\b56-m7s - 300_m_g.jpg Destination: C:\users\js\foo\b56-m7s-2.jpg".
What if: Performing the operation "Rename File" on target "Item: C:\users\js\foo\c56-m7s - 300_m_f.jpg Destination: C:\users\js\foo\c56-m7s-1.jpg".
What if: Performing the operation "Rename File" on target "Item: C:\users\js\foo\c56-m7s - 300_m_g.jpg Destination: C:\users\js\foo\c56-m7s-2.jpg".
1 голос
/ 24 октября 2019

Близко, но вы хотите убедиться, что совпадение с предыдущим пробелом также совпадает, чтобы удалить его, и вы обязательно должны включить расширение.

Get-ChildItem *.jpg | Foreach-Object {
    $currentFile = $_
    $renamed = $false
    $count = -1
    while(-Not $renamed){
      $newName = $currentFile.Name -replace '(\s+-.*)*\..*', ''
      if( ++$count -gt 0 ){
        $newName += "(${count})"
        Write-Output "Using name: ${newName}"
      }
      try {
        Rename-Item $_ "${newName}$($currentFile.Extension)" -EA Stop 2>$null
        $renamed = $true
      } catch {
        if( $_.Exception -match "Cannot create a file when that file already exists." ){
          Write-Warning "Filename ${newName}$($currentFile.Extension) exists - incrementing filename"
        } else {
        Write-Error $_
        $renamed = $true # set renamed to true because some other error occurred on this file, continue to the next one
        }
      }
    }
  }

В основном мы сопоставляемв приведенном выше выражении с помощью оператора -replace и замените его пустой строкой. "$()" позволяет нам вычислять выражение в строке и возвращать отображаемую строку с вычисленным значением, а не просто ссылаться на переменную, которую вы можете сделать с помощью "$var" или "$ {var}". Мы делаем это дважды - один раз для имени файла, а затем снова для восстановления расширения из исходного объекта файла, поскольку -replace в конечном итоге удаляет расширение из нового имени.

Объяснение регулярного выражения

  • \s соответствует любому пробельному символу
  • + соответствует одному или нескольким предыдущим символам
  • - в данном случае это литерал -символ
  • . соответствует любому символу
  • * соответствует нулю или более предшествующего символа
  • \. - это литерал .. Нам нужно сопоставить это для расширения.
  • () означает группу. Думайте об этом как о подвыражении. Вы можете сопоставить группу с квантификаторами (такими как + или *), как если бы это был один символ.

Поэтому, чтобы разбить вышеприведенное выражение, мы необязательно сопоставим one or more whitepace characters(обратите внимание, что * после группы), затем один -, за которым следует zero or more additional characters. Затем мы определим соответствие по расширению, потому что мы хотим, чтобы оно было удалено из нового имени (оно будет добавлено в Rename-Item).

EDIT

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...