web-dev-qa-db-ja.com

何百万ものファイルを含む巨大なディレクトリを移動するにはどうすればよいですか?

私には、コンピューターについて何も知らないクライアントがいて、Windows7を実行している古いAMDAthlon II X4デスクトップのリカバリパーティションからフォーマットして再インストールしました。これは、彼の主要なビジネスマシンでした。

ライブ環境からRecuvaとDiskDiggerを使用して、ファイルを3TBの外付けHDDにコピーしました。

DiskDiggerにはファイルの宛先名の制限があることを私はほとんど知りませんでした。そのため、すでにかなりいっぱいになっている外付けドライブのルートディレクトリを使用せざるを得ませんでした。両方のプログラムを実行するのにほぼ3日かかりましたが、現在、Windowsエクスプローラーもパピーリナックスの最小限のファイルマネージャーもディレクトリを完全にロードできません。

Folder Axe(フォルダースプリッター)を使用してルートディレクトリをより管理しやすい部分に分割しようとしましたが、操作するフォルダーを選択するときに遅れます。

ドキュメント用にフォルダーを最適化して(エクスプローラーでの読み込み時間を短縮することを読みました)、Windowsで8.3ファイル名を無効にしてみました。

はい、SUに「何百万ものファイルが応答しないWindowsフォルダ」について別の質問があったことを知っています。しかし、どれもそれほど素晴らしい答えではなく、私の特定の問題にも実際には関係していませんでした。

アイデア、回避策、推測はありますか?

3
Truefire

私がこれを正しく理解している場合、次の問題があります。

  • フォルダ構造を回復できないファイル回復ツールを実行しました
  • 現在、1つのディレクトリに約1億個のファイルがあります
  • これらのファイルを列挙しようとするとクラッシュします
  • これをサブフォルダーに分割しようとしましたが、そのツールでさえクラッシュします

幸運なことに、 この大失敗 ...から残っている別の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個のファイルしか取得できていません。あなたの前に別の週末のプロジェクトがあるようです。幸運を。

1
Tanner Faulkner

XCOPYを使用してみます(help xcopy cmd.exe)。ただし、フォルダ名のみを通知するようにしてください。つまり、しないでください:folder\*。例えば:

xcopy/Q/Y C:\ clientPath\bigDirectory Z:\ externalPath\bigDirectory

これにより、ディレクトリが静かにxcopyされます(/Q)上書き(/Y)すべてのファイル。

1
AuoroP