我怎样才能移动包含数百万个文件的巨大目录?

我怎样才能移动包含数百万个文件的巨大目录?

我有一个对计算机一无所知的客户,他从运行 Windows 7 的旧 AMD Athlon II X4 台式机的恢复分区格式化并重新安装。这是他的主要商务机器。

我使用实时环境中的 Recuva 和 DiskDigger 将文件复制到我的 3TB 外部硬盘。

我不知道,DiskDigger 有文件目标名称限制,所以我被迫使用已经很满的外部驱动器的根目录。运行这两个程序花了将近 3 天的时间,现在,Windows 资源管理器或 Puppy Linux 中的最小文件管理器都无法完全加载目录。

我尝试使用 Folder Axe(文件夹分割器)将根目录分解为更易于管理的部分,但是在选择要处理的文件夹时它会滞后。

我尝试优化文档文件夹(我了解到这可以减少资源管理器的加载时间)并在 Windows 中禁用 8.3 文件名。

是的,我知道 SU 上还有另一个关于“包含数百万个文件的 Windows 文件夹无响应”的问题。但没有一个答案真的那么好,也没有真正与我的具体问题相关。

有什么想法、解决方法或猜测吗?

答案1

如果我理解正确的话,您会遇到以下问题:

  • 您运行了文件恢复工具,但该工具无法恢复文件夹结构
  • 现在单个目录中有大约 10 亿个文件
  • 任何尝试枚举这些文件的操作都会崩溃
  • 您尝试将其拆分为子文件夹,但该工具也崩溃了

幸运的是,我找到了另外 1,562,922 个文件这场灾难...我很确定我们可以使用 PowerShell 将其拆分为子文件夹。

首先,让我们启动 PowerShell ISE 并枚举所有文件并将其存储在变量中。

$files = ls C:\recovered\

运行该命令然后去吃午饭。我保证它会完成最终...

现在我们要循环遍历所有这些文件并将它们移动到可管理的子文件夹中。首先,让我们看看我们要处理多少个文件:

$files.count

我会尝试分块解释,以便您可以根据需要轻松更改它...如果这对您来说太冗长,请原谅我。我们首先设置循环:

#This is to keep track of files
$i = 0

#This is to keep track of subfolders
$x = 0

do
{

}
while ($i -le $files.count)

我选择按每 1,000 个文件进行划分:

$i = 0
$x = 0

do
{
    #If $i is divisible by 1000 with no remainder...
    #Create a new folder
    if ($i % 1000 -eq 0){

            #Increment x
            $x++

            #Log progress to the console
            Write-Host "Creating folder $x..."

            #Create the new folder
            #Start with a DIFFERENT root folder
            New-Item -Path C:\recovered_subfolders -Name $x -ItemType directory
        }
}
while ($i -le $files.count)

在恢复所有文件的文件夹以外的文件夹中启动此过程,这样您就可以立即查看文件。

现在我们实际移动文件。这是我的整个脚本的样子:

$i = 0
$x = 0

do
{
    if ($i % 1000 -eq 0){
            $x++
            Write-Host "Creating folder $x..."
            New-Item -Path C:\recovered_subfolders -Name $x -ItemType directory
        }
    Move-Item $files[$i] -Destination C:\recovered_subfolders\$x\
    $i++
}
while ($i -le $files.count)

它已经运行了大约 20 分钟,我只处理了 22,000 个文件。看来你还有另一个周末项目等着你。祝你好运。

答案2

我会尝试使用 XCOPY(help xcopy在 cmd.exe 中),但请确保仅告诉它文件夹的名称;即不要:folder\*。例如:

xcopy /Q /YC:\clientPath\bigDirectory Z:\externalPath\bigDirectory

这将悄悄地复制目录 ( /Q) 并覆盖 ( /Y) 所有文件。

相关内容