Powershell拆分多个文件夹中的巨大文件夹

时间:2015-11-20 00:38:41

标签: powershell

我有一个包含许多大文件的文件夹。我想将这些文件拆分为3个文件夹。要求是获取主文件夹中的文件计数,然后将这些文件平均分成3个子文件夹。 示例 - 主文件夹有100个文件。当我运行powershell时,应分别使用33,33和34个文件创建3个子文件夹。 我们怎样才能使用Powershell做到这一点?

我尝试过以下方法:

repeat = (N<2) ? N : 2;
for ( i = 0; repeat > 0; repeat--, i = N-1 )

3 个答案:

答案 0 :(得分:2)

这是另一种解决方案。这个帐户不存在子文件夹。

# Number of groups to support
$groupCount = 3 
$path = "D:\temp\testing"
$files = Get-ChildItem $path -File 

For($fileIndex = 0; $fileIndex -lt $files.Count; $fileIndex++){
    $targetIndex = $fileIndex % $groupCount
    $targetPath = Join-Path $path $targetIndex
    If(!(Test-Path $targetPath -PathType Container)){[void](new-item -Path $path -name $targetIndex -Type Directory)}
    $files[$fileIndex] | Move-Item -Destination $targetPath -Force
}

如果您需要将文件拆分为不同数量的组,请使用高于该值的$groupCount。也可以使用switch处理逻辑,将$groupCount更改为某些内容否则,如果计数大于500,例如。

逐个循环文件​​。使用$fileIndex作为跟踪器,我们确定文件将放入的文件夹0,1或2。然后使用该值检查以确保目标文件夹存在。是的,这个逻辑可以很容易地放在循环之外,但如果你在脚本运行时更改了文件和文件夹,你可能会认为它更有弹性。

确保文件夹存在,如果不存在则。然后移动那一项。使用模数运算符,就像在其他答案中一样,我们不必担心有多少文件。让PowerShell做数学运算。

答案 1 :(得分:1)

这是超级快速和肮脏的,但它确实起作用。

#Get the collection of files
$files = get-childitem "c:\MainFolder"

#initialize a counter to 0 or 1 depending on if there is a
#remainder after dividing the number of files by 3.
if($files.count % 3 -eq 0){
    $counter = 0
} else {
    $counter = 1
}

#Iterate through the files
Foreach($file in $files){

    #Determine which subdirectory to put the file in
    If($counter -lt $files.count / 3){
            $d = "Dir1"
    } elseif($counter -ge $files.count / 3 * 2){
            $d = "Dir3"
    } else {
        $d = "Dir2"
    }

    #Create the subdirectory if it doesn't exist
    #You could just create the three subdirectories
    #before the loop starts and skip this
    if(-Not (test-path c:\Child\$d)){
        md c:\Child\$d
    }

    #Move the file and increment the counter
    move-item $file.FullName -Destination c:\Child\$d
    $counter ++
}

答案 2 :(得分:1)

我认为没有做计数和自己分配是可能的。这个解决方案:

  • 列出所有文件
  • 添加一个计数器属性,循环0,1,2,0,1,2,0,1,2到每个文件
  • 根据计数器将它们分组到存储桶中
  • 在一个命令中移动每个存储桶

可以通过多种方式重写它以使其更好,但这可以节省数学,处理不均匀的分配,迭代文件并一次移动一个文件,可以轻松调整到不同的团体数量。

$files = (gci -recurse).FullName 
$buckets = $files |% {$_ | Add-Member NoteProperty "B" ($i++ % 3) -PassThru} |group B

$buckets.Name |% {
    md "c:\temp$_"
    Move-Item $buckets[$_].Group "c:\temp$_"
}