删除每个子目录中除最新的模式文件外的所有文件

Delete All But The Newest File of Pattern In Each Subdirectory

要求:

  1. 遍历每个目录中的所有文件夹和文件
  2. 删除每个子目录中的所有文件,除了最新的文件(包含文件名时间戳)并具有特定的文件名模式,或者复制每个子目录中最新的文件和前面的文件LIVE_DATA。 (我希望忽略每个子目录中的其他文件)。

    • 目录: AISI-301.0000000001006165.2015-08-24_23-57-46-1
    • 文件: LIVE_DATA_2015-08-24_23-57-51.413+0000.MCA

如何在仅比较每个子目录中的文件时递归地遍历所有文件?我不想将所有这些放在一起比较。只是每个子目录中的一个。

for $filename in Get-ChildItem -recurse {
    for $filename in $directory {
        if ($filename > $filename2) {
            $temp = $filename
        }
        $filename2 = $filename1
    }
}

这就是我最终用来在目录名称后重命名我的文件的方法。它将文件名附加到末尾,目录名在前。我希望这对可能正在寻找此解决方案的其他人有所帮助。

    Get-ChildItem -include *LIVE_DATA_*.MCA -recurse | Rename-Item -NewName { $_.Directory.Name+'_'+$_.Name}

如果您想删除所有文件 LIVE_DATA_* 除了最近的文件,您可以这样做:

$root = 'C:\path\to\root\folder'

Get-ChildItem $root -Recurse | ? { $_.PSIsContainer } | ForEach-Object {
  Get-ChildItem (Join-Path $_.FullName 'LIVE_DATA_*') |
    Sort-Object Name -Desc |
    Select-Object -Skip 1 |
    Remove-Item -Force
}

Get-ChildItem $root -Recurse | ? { $_.PSIsContainer } 列出 $root 的所有子文件夹。然后 ForEach-Object 分别为每个子文件夹运行另一个 Get-ChildItem 语句(没有递归)。 Join-Path 语句根据文件名模式和文件夹的完整路径构建通配符路径 (C:\path\to\root\folder\sub\folder\LIVE_DATA_*)。

代码基本上列出所有文件夹,然后处理每个单独文件夹的文件。