Переименование самых больших файлов, содержащих отдельные подстроки заданной длины в powershell - PullRequest
1 голос
/ 23 октября 2019

Я боролся со следующим на powershell:

У меня есть файлы с первыми 3 символами, ссылающимися на идентификатор, а остальная часть имени файла содержит метку времени.

ABC .2019-10-23 РАЗМЕР: 5KB

ABC .2019-10-22 РАЗМЕР 7KB

DEF .2019-10-23 РАЗМЕР 4 КБ

DEF .2019-10-22 РАЗМЕР 11 КБ

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

Все файлы находятся в одной папке и могут быть зациклены без рекурсии.

После завершения задачи этодолжен был переименовать файлы:

ABC .2019-10-22.old

DEF .2019-10-22.old

Поскольку первый файл является самым большим, который содержит 3-символьную подстроку ABC

А второй файл является самым большим файлом, который содержит подстроку DEF

Это должно быть сделано для всех самых больших файлов, содержащих четкий 3-значный идентификатор

Любая помощь будет принята с благодарностью!

1 Ответ

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

Lee_Daily предоставил план решения в комментарии:

используйте Group-Object с вычисленной целью группировки [первые 3 символа], отсортируйте каждую группу по.Length, затем переименуйте самое большое.

Чтобы сформулировать это более конкретно:

Get-ChildItem -File | 
  Group-Object { $_.Name -replace '\..+' } | 
    ForEach-Object { 
      $_.Group | Sort-Object Length -Descending | Select-Object -First 1 |
        Rename-Item -NewName { $_.Name + '.old' } -WhatIf
    }

-WhatIf предварительный просмотр операции. Удалите его, если вы уверены, что он будет делать то, что вам нужно.

  • Get-ChildItem -File перечисляет все файлы в текущем каталоге (адаптируются по мере необходимости).

  • Вызов Group-Object группирует файлы по их первому . -отделенному токену (например, ABC, DEF)

    • $_.Name -replace '\..+' использует регулярное выражение для эффективного удаления всего, начиная с первого литерала . char. из входной строки (имя файла) - см. этот ответ для получения дополнительной информации об операторе -replace;Например,
      'ABC.More.Tokens' -replace '\..+' приводит к 'ABC'
  • Вызов ForEach-Object обрабатывает каждую результирующую группу (.Group):

    • Вызов Sort-Object сортирует по убыванию по размеру файла (.Length).
    • Затем Select-Object -First 1 выбирает только первый и, следовательно, самый большой файл.
      • Примечание. В PowerShell Core можно комбинировать вызовы Sort-Object и Select-Object на Sort-Object -Top 1
    • Наконец, Rename-Item переименовывает файл, добавляя .old к существующему имени.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...