在目录中递归过滤所有文件,然后将它们移动到一组新的文件夹,每个文件夹的每个目录都有一个文件限制

时间:2017-12-07 22:48:54

标签: powershell

很抱歉这个长标题,只是想具体一点。

这是我今天的情景(正如标题所暗示的那样):

Root Dir有x个文件夹,比如说20.每个文件夹都有文件和可能的子文件夹。我知道我只关心任何文件夹中的文件" Hold"在文件夹名称中。

我需要定位文件夹和子文件中的所有文件,无论类型如何。然后,我需要将目标文件移动到根目录中的新文件夹。每个文件夹必须只容纳50,000个文件,然后转到下一个50k的下一个文件夹。该过程将重复进行,直到所有目标都转移到新目录。

这是我到目前为止的PS代码:

#SETUP
$FileDir = GCI -Path C:\TEST -Filter 'Hold*' -Directory -Recurse
$FilesinHOLD = GCI -File -Path $FileDir.FullName -Recurse
$NewDir = 'C:\TEST\Limited'
$Limit = '50000'

#Execution
$FilesinHOLD | Select-Object -First $Limit | Move-Item -Destination $NewDir

我离开的地方正在寻找自动创建一个新的"有限的"文件夹并将50k放入其中然后重复该过程。我想知道是否有可能只是简单地在(2)和然后(3)之后呈现相同的名称,依此类推,作为Windows资源管理器中的默认行为。?它看起来像这样:

  

C:\ TEST \限定

     

C:\ TEST \有限公司(2)

     

C:\ TEST \有限公司(3)

我会通过跑回来删除现在空的" HOLD"我通过GCI或Measure-Object验证文件为空后从中提取文件的目录。

提前感谢您的意见。

-CE

1 个答案:

答案 0 :(得分:1)

而不是抓取所有文件然后从数组中删除它们,我会移动它们,因为我递归目录,然后循环:

$rootDir = 'C:\TEST\Limited' 
$NewDir = $rootDir
$Limit = '50000'
$filesMoved = $Limit
$folderCnt = 1
while($filesMoved -ge $limit)
{    
    $filesMoved = GCI -Path C:\TEST -Filter 'Hold*' -Directory -Recurse | GCI -File -Recurse | Select-Object -First $Limit | Move-Item -Destination $NewDir -passthru | measure | select -expand count
    $folderCnt += 1
    $newDir = $rootDir +"($folderCnt)"
}