【问题标题】:Retain first file for each date保留每个日期的第一个文件
【发布时间】:2013-07-23 18:00:42
【问题描述】:

我想在我的目录中保留5个最后生成的文件,只保留每个日期的第一个文件,因为在我的子文件夹中,我在同一天多次生成了文件。

我有多个文件夹,子文件夹名为“old”

C:\test\folder1\old
C:\test\toto\old
...

例如,在我的子文件夹中,我有这个:

   Mode                LastWriteTime     Length Name                                                                                                                                                                                                                                                   
----                -------------     ------ ----                                                                                                                                                                                                                                                   

-a---        07/06/2013     12:01  231248950 geofi.ry.7.0.0.159940.zip                                                                                                                                                                                                                             
-a---        07/06/2013     12:33  231248506 geofi.ry.7.0.0.159950.zip                                                                                                                                                                                                                             
-a---        07/06/2013     14:51  231248957 geofi.ry.7.0.0.159962.zip                                                                                                                                                                                                                             
-a---        17/06/2013     19:47  231248860 geofi.ry.7.0.0.160871.zip                                                                                                                                                                                                                             
-a---        18/06/2013     11:03  231248480 geofi.ry.7.0.0.160907.zip
-a---        23/06/2013     07:30  231250266 geofi.ry.7.0.0.161571.zip                                                                                                                                                                                                                                   
-a---        23/06/2013     21:30  231250266 geofi.ry.7.0.0.161563.zip                                                                                                                                                                                                                             
-a---        04/07/2013     00:42  231249910 geofi.ry.7.0.0.162695.zip
-a---        04/07/2013     16:12  231249910 geofi.ry.7.0.0.162647.zip                                                                                                                                                                                                                                  
-a---        08/07/2013     16:10  231250481 geofi.ry.7.0.0.163046.zip                                                                                                                                                                                                                             
-a---        10/07/2013     08:40  231250476 geofi.ry.7.0.0.163378.zip                                                                                                                                                                                                                                                                                                                                                                                                                                                          
-a---        17/07/2013     10:22  231249418 geofi.ry.7.0.0.164001.zip                                                                                                                                                                                                                             

我想保留这些文件:

-a---        17/07/2013     10:22  231249418 geofi.ry.7.0.0.164001.zip
-a---        10/07/2013     08:40  231250476 geofi.ry.7.0.0.163378.zip   
-a---        08/07/2013     16:10  231250481 geofi.ry.7.0.0.163046.zip    
-a---        04/07/2013     00:42  231249910 geofi.ry.7.0.0.162695.zip (on this date i have two files, I want to keep the first generated at this date 00:42).
-a---        23/06/2013     07:30  231250266 geofi.ry.7.0.0.161571.zip (on this date i have two files, I want to keep the first generated at this date 07:30).

这是一个草稿,但我卡住了,我该如何比较时间?

$Days = "5"

$TargetFolder = "C:\test\"

$Extension = "*.zip"

 $Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | sort-object {$_.LastWriteTime} -Descending | ? { $_.fullname -match "old" } | select-object -First 1

 $most_recent_date = $files.LastWriteTime

 $LastWrite = $most_recent_date.Add(-$Days)

 $Files2 = Get-Childitem $TargetFolder -Include $Extension -Recurse | Where {$_.LastWriteTime -le "$LastWrite"}  | ? { $_.fullname -match "old" }


 foreach ($File in $Files2) 
    {
    if ($File -ne $NULL)
        {
        Remove-Item $File.FullName | out-null
        }
    else
        {
        Write-Host "No more files to delete!"
        }
    }

谢谢

【问题讨论】:

    标签: powershell scripting powershell-2.0 powershell-3.0


    【解决方案1】:

    我从您的问题中假设您只想在所有子文件夹中保留 5 个文件,如果是这样,下面的代码将满足您的需求。如果您想为每个子文件夹保留 5 个文件,那么您将首先创建这些文件夹的外循环,然后为每个单独的文件夹运行下面的代码。

    $TargetFolder = "C:\test\"
    
    $AllFiles = Get-Childitem $TargetFolder -Filter *.zip -Recurse | 
      ? { $_.fullname -match "old" -and -not $_.PSIsContainer  }
    
    $KeepFiles = $AllFiles | 
      Sort-Object LastWriteTime | 
      Group-Object {$_.LastWriteTime.Date} | 
      % {$_.Group[0]} | 
      Sort-Object LastWriteTime -Descending |
      Select-Object -First 5
    
    Compare-Object -ReferenceObject $AllFiles -DifferenceObject $KeepFiles -PassThru |
      Remove-Item
    

    【讨论】:

    • 谢谢,但它不能正常工作。我想保留每个日期的第一个文件,只保留最后生成的 5 个,看看我发布的示例
    • 发现我的代码有问题 - 已进行编辑以更正。
    • 谢谢,但不好...它删除了我几乎所有的 zip 文件
    【解决方案2】:

    如果您想在所有文件夹中保留 5 个最近日期的最新文件,请尝试以下操作:

    $TargetFolder = 'C:\test'
    $Extension    = '*.zip'
    
    $files = gci $TargetFolder -Include $Extension -Recurse |
        ? { -not $_.PSIsContainer -and $_.Directory.Name -eq 'old' }
    $keep = $files | sort LastWriteTime -Desc | group {$_.LastWriteTime.Date} |
        % {$_.Group[-1].FullName} | select -First 5
    $totalSize = ($files | ? { $keep -notcontains $_.FullName } |
        Measure-Object -Sum Length).Sum
    $files | ? { $keep -notcontains $_.FullName } | Remove-Item -WhatIf
    
    "Deleted size: {0:N3}" -f ($totalSize / 1GB)
    

    如果您想保留每个文件夹中最近 5 个日期的最新文件,请尝试以下操作:

    $TargetFolder = 'C:\test'
    $Extension    = '.zip'
    $totalSize    = 0
    
    gci $TargetFolder -Recurse | ? { $_.PSIsContainer -and $_.Name -eq 'old' } | % {
      $files = gci $_.FullName | ? { -not $_.PSIsContainer -and
          $_.Extension -eq $Extension }
      $keep = $files | sort LastWriteTime -Desc | group {$_.LastWriteTime.Date} |
          % {$_.Group[-1].FullName} | select -First 5
      $totalSize += ($files | ? { $keep -notcontains $_.FullName } |
          Measure-Object -Sum Length).Sum
      $files | ? { $keep -notcontains $_.FullName } | Remove-Item -WhatIf
    }
    
    "Deleted size: {0:N3}" -f ($totalSize / 1GB)
    

    Remove-Item 中删除-WhatIf-switch,并在您仔细检查代码是否确实符合您的要求后重新运行代码。

    【讨论】:

    • 它不能正常工作,因为在我的一个子文件夹中,你的脚本删除了错误的文件......我想在我的目录中保留 5 个最后生成的文件,并且只保留每个文件的第一个文件日期。在我的帖子中查看我的示例 感谢您的帮助
    • @Adeel 我必须在第二个示例中修复扩展过滤。除此之外,代码应该做你想做的事。如果没有:出示证据。当我测试它时,它按预期工作。
    • 你的第二个例子很好,有一个微妙之处。如果我在同一日期生成了两个文件:file1.zip 10/07/2013 07:00 file2.zip 10/07/2013 09:00 我想保留 file1.zip 而不是 file2.zip,因为 file1.zip 是该日期第一个生成的,所以我不想保留最后一个生成的。感谢您的帮助
    • @AdeelASIF 我想我明白了。排序顺序没问题,但是您需要从每个组中选择最后一个而不是第一个成员(这是我之前错过的部分)。试试更新后的答案。
    • 是的,现在很好! :) 现在最后一件事,如何以 GB 或 MB 为单位计算已删除文件的总大小?谢谢
    【解决方案3】:

    这一行呢?

    Get-Childitem $TargetFolder -Include $Extension -Recurse |Sort-Object lastwritetime -Descending | Group-Object @{Expression={($_.lastwritetime).Date}} | % {$_.group | Select-Object -Last 1}
    

    1) 获取所有文件,这里可以添加你想要的过滤器。

    2) 按 lastwritetime 降序对结果进行排序。

    3) 按日期对结果进行分组,因此我为每个日期分组。

    4) 获取组中每个日期的最后一个元素。


    我忘了| Select-Object -First 5

    Get-Childitem $TargetFolder -Include $Extension -Recurse |Sort-Object lastwritetime -Descending | Group-Object @{Expression={($_.lastwritetime).Date}} | % {$_.group | Select-Object -Last 1} | Select-Object -First 5
    

    这仅适用于一个目录试试这个:

    Get-ChildItem $TargetFolder -Recurse | where {$_.psiscontainer} | % { Get-ChildItem -Path $_.fullname -filter $Extension |Sort-Object lastwritetime -Descending | Group-Object @{Expression={($_.lastwritetime).Date}} | % {$_.group | Select-Object -Last 1} | Select-Object -First 5}
    

    【讨论】:

    • 对不起,我忘记了。如果你以| Select-Object -First 5结束,会追加什么
    • 它给了我一个错误,你能解释一下为什么使用`字符吗? ForEach-Object:无法绑定参数“RemainingScripts”。无法转换“|” “System.String”类型的值以键入“System.Management.Automation.ScriptBlock”
    • 它无法正常工作,请参阅此处pastebin.com/wMGEJ6zb 这是| Select-Object -First 5 pastebin.com/ZgttmJf9 Thx 的结果
    • 我不明白你的问题。此代码适用于一个文件夹和子文件夹,并给出在最后几天写入文件的五个写入的第一个文件。
    • 我有多个文件夹,子文件夹名为“old”,请再次查看我的第一篇文章... C:\test\folder1\old C:\test\folder2\old 我知道我可以添加 | ? { $_.fullname -match "old" } 但这不是问题。您的第一个没有| Select-Object -First 5 的代码给了我很好的排序,但结果中有一个重复的文件夹?为什么 ?而您使用| Select-Object -First 5 的第二个代码不起作用,它只扫描一个文件夹...请再次检查我在pastebin 上发布的内容。谢谢
    【解决方案4】:

    这项工作也可以借助内置关联数组的旧批处理来完成:

    @ECHO OFF &SETLOCAL ENABLEDELAYEDEXPANSION
    FOR /f "delims=" %%a IN ('dir /a-d /b *.zip') DO (
        FOR /f "tokens=2-4delims=/ " %%b  IN ("%%a") DO SET "filedate=%%d%%c%%b"
        FOR /f "tokens=3" %%b IN ("%%a") DO SET "filetime=%%b"
        SET "$!filedate!$!filetime!=%%a"
    )
    FOR /f "delims=$" %%a IN ('set "$"') DO (
        IF NOT "%%a"=="!files!" (
            SET "file="
            FOR /f "tokens=2*delims=$=" %%b IN ('set "$%%a"') DO IF NOT DEFINED file SET "file=%%c"
            SET "#%%a=!file!"
            SET "files=%%a"
            SET /a filecount+=1
        )
    )
    SET /a filecount-=5
    FOR /f "skip=%filecount%tokens=2delims==" %%a IN ('set "#"') DO ECHO %%a
    

    会话协议:

    >dir /a-d *.zip -a--- 07/06/2013 12:01 231248950 geofi.ry.7.0.0.159940.zip -a--- 07/06/2013 12:33 231248506 geofi.ry.7.0.0.159950.zip -a--- 07/06/2013 14:51 231248957 geofi.ry.7.0.0.159962.zip -a--- 17/06/2013 19:47 231248860 geofi.ry.7.0.0.160871.zip -a--- 18/06/2013 11:03 231248480 geofi.ry.7.0.0.160907.zip -a--- 23/06/2013 07:30 231250266 geofi.ry.7.0.0.161571.zip -a--- 23/06/2013 21:30 231250266 geofi.ry.7.0.0.161563.zip -a--- 04/07/2013 00:42 231249910 geofi.ry.7.0.0.162695.zip -a--- 04/07/2013 16:12 231249910 geofi.ry.7.0.0.162647.zip -a--- 08/07/2013 16:10 231250481 geofi.ry.7.0.0.163046.zip -a--- 10/07/2013 08:40 231250476 geofi.ry.7.0.0.163378.zip -a--- 17/07/2013 10:22 231249418 geofi.ry.7.0.0.164001.zip >脚本.bat -a--- 23/06/2013 07:30 231250266 geofi.ry.7.0.0.161571.zip -a--- 04/07/2013 00:42 231249910 geofi.ry.7.0.0.162695.zip -a--- 08/07/2013 16:10 231250481 geofi.ry.7.0.0.163046.zip -a--- 10/07/2013 08:40 231250476 geofi.ry.7.0.0.163378.zip -a--- 17/07/2013 10:22 231249418 geofi.ry.7.0.0.164001.zip

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-12
      相关资源
      最近更新 更多