Get-ChildItem -Recurse的更快替代方案

时间:2012-03-26 15:57:22

标签: powershell

我有一个使用Get-ChildItem查找目录中特定文件的脚本。然后,我使用两个不同的SQL表来比较那些带有约束的文件,如果它们符合某些条件,则删除这些文件。

基本上就是这样:

- 作为参考,-include $ include变量是用作文件名的唯一id(字符串)。我正在删除所有与该名称相似的文件。

示例:

$include: 9d3aa8ee-e60e-4b4f-9cd0-6678f8a5549e*.*

查询表#1,将结果放入数组中。
查询表#2,将结果放入数组中。

~~~ Psuedo代码 ~~~

    foreach ($i in table #1) {
        foreach ($x in table #2) {

            if (constraints are met) {
                $files = Get-ChildItem -Path $path  -Recurse -include $include | foreach-object -process { $_.FullName }

                Delete the files
            }
        }
    }

我的问题:此服务器上大约有1400万个文件。
我在测试服务器上运行了大约150万个文件的脚本,这需要将近两个小时。

我尝试在实时服务器上运行此脚本,但三天后它仍然没有完成。

我该怎么做?

4 个答案:

答案 0 :(得分:1)

如果我关注您,则会针对要删除的每个文件模式在一个巨大的目录上进行递归。如果是这种情况,那么我会首先找到所有模式,然后才使用一个Get-ChildItem调用来删除文件。

$include = foreach( $i in table #1 ) 
{
    foreach( $x in table #2 ) 
    {    
       if(constraints are met) 
       {
           output file pattern
       }    

    }
}

Get-ChildItem -Path $path -Recurse -Include $include| Remove-Item -Force

答案 1 :(得分:1)

为了从大型目录结构中获取全名字符串,使用/ B开关的传统DIR命令可以更快:

cmd /c dir $path\9d3aa8ee-e60e-4b4f-9cd0-6678f8a5549e*.* /b /s /a-d

答案 2 :(得分:1)

好吧,我不知道你的意思是什么约束。但是几年前,我编写了一个名为Find-ChildItem的cmdlet,它是Get-ChildItem的替代品。

它内置了更多选项,例如删除大于某个大小且超过一些时间的文件或仅删除空文件。这可能有助于您从脚本中删除一些额外的循环和cmdlet,从而提高性能。你可能想尝试一下。

您可以在我的博客 Unix / Linux find equivalent in Powershell Find-ChildItem Cmdlet 上获取有关此Find-ChildItem cmdlet的更多详细信息。

Find-ChildItem的一些选项

  1. Find-ChildItem -Type f -Name“。*。exe”
  2. Find-ChildItem -Type f -Name“.c $” - EXec“Get-Content {} | Measure-Object -Line -Character -Word”
  3. Find-ChildItem -Type f -Empty
  4. Find-ChildItem -Type f -Empty -OutObject
  5. Find-ChildItem -Type f -Empty -Delete
  6. Find-ChildItem -Type f -Size + 9M -Delete
  7. Find-ChildItem -Type d
  8. Find-ChildItem -Type f -Size + 50m -WTime +5 -MaxDepth 1 -Delete
  9. 我希望这对你有所帮助......

答案 3 :(得分:0)

要使用1400万个文件,找一个这样的文件需要多长时间?

您可能只是在与I / O子系统进行斗争,并且脚本的选择可能无关紧要。

我的建议是基于单个文件删除来确定您是否可以合理地完成此任务,或者您可能需要查看您的硬件配置。