gpt4 book ai didi

windows - 如何拆分一个巨大的文件夹?

转载 作者:可可西里 更新时间:2023-11-01 12:41:30 27 4
gpt4 key购买 nike

我们在 Windows 上有一个文件夹……非常大。我运行了“dir > list.txt”。该命令在 1.5 小时后失去响应。输出文件约为 200 MB。它显示至少有 280 万个文件。我知道情况很愚蠢,但让我们关注问题本身。如果我有这样一个文件夹,如何将它拆分为一些“可管理”的子文件夹?令人惊讶的是,我提出的所有解决方案都涉及在某个时候获取文件夹中的所有文件,这对我来说是不行的。有什么建议吗?

感谢 Keith Hill 和 Mehrdad。我接受了 Keith 的回答,因为这正是我想做的,但我无法让 PS 快速运行。

在 Mehrdad 的提示下,我编写了这个小程序。移动 280 万个文件需要 7 个多小时。所以最初的 dir 命令确实完成了。但不知何故,它没有返回到控制台。

namespace SplitHugeFolder
{
class Program
{
static void Main(string[] args)
{
var destination = args[1];

if (!Directory.Exists(destination))
Directory.CreateDirectory(destination);

var di = new DirectoryInfo(args[0]);

var batchCount = int.Parse(args[2]);
int currentBatch = 0;

string targetFolder = GetNewSubfolder(destination);

foreach (var fileInfo in di.EnumerateFiles())
{
if (currentBatch == batchCount)
{
Console.WriteLine("New Batch...");
currentBatch = 0;
targetFolder = GetNewSubfolder(destination);
}

var source = fileInfo.FullName;
var target = Path.Combine(targetFolder, fileInfo.Name);
File.Move(source, target);
currentBatch++;
}
}

private static string GetNewSubfolder(string parent)
{
string newFolder;
do
{
newFolder = Path.Combine(parent, Path.GetRandomFileName());
} while (Directory.Exists(newFolder));
Directory.CreateDirectory(newFolder);
return newFolder;
}
}
}

最佳答案

我每天晚上使用 Get-ChildItem 将我的整个 C: 驱动器索引到 c:\filelist.txt。这大约是 580,000 个文件,生成的文件大小约为 60MB。无可否认,我使用的是 Win7 x64,内存为 8 GB。也就是说,您可以尝试这样的事情:

md c:\newdir
Get-ChildItem C:\hugedir -r |
Foreach -Begin {$i = $j = 0} -Process {
if ($i++ % 100000 -eq 0) {
$dest = "C:\newdir\dir$j"
md $dest
$j++
}
Move-Item $_ $dest
}

关键是以流式方式进行移动。也就是说,不要将所有 Get-ChildItem 结果收集到一个变量中然后继续。这将需要所有 280 万个 FileInfos 一次在内存中。此外,如果您在 Get-ChildItem 上使用 Name 参数,它将输出一个包含文件相对于基本目录的路径的字符串。即便如此,也许这个大小只会压倒您可用的内存。毫无疑问,执行起来需要相当长的时间。 IIRC 正确,我的索引脚本需要几个小时。

如果它确实有效,您应该以 c:\newdir\dir0dir28 结束,但是话又说回来,我根本没有测试过这个脚本,所以您里程可能会有所不同。顺便说一句,这种方法假设你的目录很大,但目录很平坦。

更新:使用Name 参数的速度几乎是原来的两倍,所以不要使用该参数。

关于windows - 如何拆分一个巨大的文件夹?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4766047/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com