重命名包含 powershell 中预定长度的不同子字符串的最大文件

Renaming largest files that contain distinct sub strings of predetermined length in powershell

我一直在努力解决 powershell 上的以下问题:

我有一些文件,前 3 个字符引用 ID,文件名的其余部分包含时间戳。

ABC.2019-10-23 大小:5KB

ABC.2019-10-22 大小 7KB

DEF.2019-10-23 大小 4KB

DEF.2019-10-22 大小 11KB

现在文件大小不一。我想做的是重命名包含不同 ID 的最大文件。

所有文件都在同一个文件夹中,可以不递归循环。

完成任务后应该重命名文件:

ABC.2019-10-22.old

DEF.2019-10-22.old

因为第一个是包含3个字符子串的最大文件ABC

而第二个文件是包含子字符串 DEF

的最大文件

应该对所有包含不同的 3 个字符 ID 的最大文件执行此操作

如有任何帮助,我们将不胜感激!

Lee_Daily 在评论中提供了解决方案的概要:

use Group-Object with a calculated grouping target [the first 3 chars], sort each group by .Length, then rename the largest.

具体来说:

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 调用按文件名的第一个 . 分隔的标记对文件进行分组(例如,ABCDEF

    • $_.Name -replace '\..+' 使用 regular expression to effectively remove everything starting with the first literal . char. from the input string (file name) - see 以获得有关 -replace 运算符的更多信息;例如,
      'ABC.More.Tokens' -replace '\..+' 产生 'ABC'
  • ForEach-Object 调用处理每个结果组 (.Group):

    • Sort-Object 调用按文件大小降序排序 (.Length)。
    • 然后 Select-Object -First 1 仅选择第一个 - 因此也是最大的 - 文件。
      • 注意:在 PowerShell Core 中,您可以将 Sort-ObjectSelect-Object 调用组合到 Sort-Object -Top 1
    • 最后,Rename-Item 通过将 .old 附加到现有名称来重命名文件。