Windowsで膨大な数のファイルを削除する方法


22

数百万のサブディレクトリと数兆のファイルを含むディレクトリがあります。そして今、私はそれをクリアしなければなりません。兆と言って、私はファイルサイズではなく、ファイルの数について話している。

で削除しdel/s、Windows Explorerを使用してみました。どちらもタスクを完了できません。サブディレクトリの一部を1つずつ削除してみましたが、数日かかりました。私が遭遇した問題は、delエクスプローラーを使用していても、エクスプローラーインスタンスが非常に高いメモリを消費し、システムが徐々にクラッシュすることをタスクマネージャーで確認できることです。

削除されるファイルはまだ数億個あります。1つ(または少数)のコマンド/アクションで達成する可能性はありますか?


[編集済み]

Cygwin rm -frで試してみたところ、同じ結果が得られました。次のように要約されます。

  1. Windowsエクスプローラー、DELコマンドプロンプト、またはCygwin rmコマンドを使用しても、システムメモリは徐々にゼロに低下し、最終的にボックスはクラッシュします。

  2. いずれかの時点で、システムに障害が発生する前にプロセスが閉じられた場合(CTRL + Cまたはその他の操作により)、ボックスは通常どおり機能し続けます。ただし、すべての使用済みメモリは解放されません。たとえば、システムメモリが91%に達したときにプロセスを停止したとします。タスクマネージャーは、合計4G RAM、キャッシュは329M、利用可能335MBと言います。その後、マシンを再起動するまで、メモリ使用量はこのレベルにとどまります。タスクマネージャでエクスプローラインスタンスを停止すると、HDDライトが常に点灯したまま画面が空白になり、戻ってこなくなります。通常、タスクマネージャーでエクスプローラーのインスタンスを停止すると、Win + Eを押すか、自動的に再起動されます。

まあ、本当に素晴らしいメモリ管理!


[もう一度編集]使用済みのメモリの一部は、しばらくしてから解放されたようですが、すべてではありません。キャッシュされたメモリと使用可能なメモリの一部がタスクマネージャに戻ってきました。私はもう待っていません、その時何が起こるかわかりません。


あなたの主な問題は、ディレクトリとサブディレクトリが削除されていないという事実ですか?
サンディープバンサル

@Jackey Cheung:使用しているウィンドウのバージョンは?
シヴァチャラン

1
ファイルを再帰的に削除するバッチスクリプトを作成できます。トップレベルからではなく、たとえば、フォルダー構造の5番目のレベルで開始します。これにより、ジョブは多くの個別の連続した「rm」に分割されます

9
どうして地獄はどうやって1兆個のファイルを手に入れたのか、知っておく必要があります
...-モアブ

2
兆個のファイルには、1 PBのファイルテーブルが必要です。最近の最大のハードディスクは数TBです。どうしてそんなに大きなパーティションを獲得したのでしょうか?
Mehrdad

回答:


10

技術説明

ほとんどの方法が問題を引き起こしている理由は、Windowsがファイルとフォルダーを列挙しようとするためです。これは、数百または数千のファイル/フォルダが数レベルの深さで問題になることはほとんどありませんが、数百のフォルダに数十のファイルがあり、数十レベルの深さになると、システムが完全に動かなくなります。 。

「100」個の「ファイル」のみがあるとします。Windowsは次のような単純な構造を使用して、各ファイルとそのパスを保存します(各ディレクトリを個別に保存せずにオーバーヘッドを節約します)。

struct FILELIST {                   // Total size is 264 to 528 bytes:
  TCHAR         name[MAX_PATH];     // MAX_PATH=260; TCHAR=1 or 2 bytes
  FILELIST*     nextfile;           // Pointers are 4 bytes for 32-bit and 8 for 64-bit
}

8ビット文字を使用するか、Unicode文字を使用するか(Unicodeを使用するかどうか)、およびシステムが32ビットか64ビットかによって、リストを保存するために25GBから49GBのメモリが必要になります(これは非常に単純化された構造)。

Windowsがファイルとフォルダーを削除する前に列挙しようとする理由はそれらを削除するために使用している方法によって異なりますが、エクスプローラーとコマンドインタープリターの両方がそれを行います(コマンドを開始すると遅延が見られます)。また、ドライブからディレクトリツリーを読み取る際に、ディスクアクティビティ(HDD LED)フラッシュを確認できます。

解決

この種の状況に対処する最善の方法は、ファイルとフォルダーを個別に1つずつ削除する削除ツールを使用することです。それを行うための既製のツールがあるかどうかはわかりませんが、単純なバッチファイルで達成できるはずです。

@echo off
if not [%1]==[] cd /d %1
del /q *
for /d %%i in (*) do call %0 "%%i"

これは、引数が渡されたかどうかを確認することです。その場合は、指定されたディレクトリに変更します(引数なしで実行して現在のディレクトリで開始するか、ディレクトリを指定できます(別のドライブでも開始できます)。

次に、現在のディレクトリ内のすべてのファイルを削除します。このモードでは、何も列挙せず、ファイルを削除するだけで、メモリを大量に消費することはありません。

次に、現在のディレクトリ内のフォルダーを列挙し、それ自体を呼び出して、各フォルダーをそのフォルダーに渡し(自己)、下方に再帰します。

分析

これ機能する理由は、ツリー全体のすべてのファイルとフォルダーを列挙しないためです。ファイルはまったく列挙されず、現在のディレクトリ内のフォルダー(および親ディレクトリ内の残りのフォルダー)のみが列挙されます。特定のフォルダにサブディレクトリが数百個しかない場合、これはそれほど悪くないはずであり、ツリー全体を列挙する他のメソッドよりも必要なメモリは確実に少なくなります。

/r(手動)再帰を使用する代わりに、スイッチを使用することについて疑問に思うかもしれません。/rスイッチは再帰を実行しますが、ディレクトリツリー全体を事前に列挙するため、これは機能しません。追跡せずに移動すると削除したいです。

比較

このメソッドを完全列挙メソッドと比較してみましょう。

「数百万のディレクトリ」があると言っていました。1億としましょう。ツリーのバランスがほぼ取れており、フォルダーごとに平均で約100個のサブディレクトリを想定すると、ネストされた最も深いディレクトリは約4レベル下になります。実際には、ツリー全体に101,010,100個のサブフォルダがあります。(100Mがどのように100と4に分解できるかを考えてください。)

ファイルを列挙していないため、レベルごとに最大100個のディレクトリ名を追跡するだけでよく4 × 100 = 400、任意の時点で最大のディレクトリが必要です。

したがって、メモリ要件は約206.25KBである必要があり、これは現代の(またはその他の)システムの制限内です。

テスト

残念ながら(?)何百万ものフォルダーに何兆ものファイルがあるシステムがないので、テストすることができません(最後のカウントでは約800K個のファイルがあったと信じています)ので、誰かが試してみる必要がありますそれ。

警告

もちろん、メモリだけが制限ではありません。ドライブは、削除するすべてのファイルとフォルダーに対して、システムが空きとしてマークする必要があるため、大きなボトルネックになります。ありがたいことに、これらのディスク操作の多くは一緒にバンドル(キャッシュ)され、個別にではなくチャンクに書き出されます(少なくともリムーバブルメディアではなくハードドライブに対して)が、システムが読み取るときにかなりのスラッシングが発生しますデータを書き込みます。


これは機能しないと確信しています。試しました。問題はFORループにあります。FORがDELを直接発行するのと同じ問題を引き起こすことが判明しました。
ジャッキーチャン

1
使用するスイッチによって異なります。/rスイッチを使用した場合、私が説明したように、すべてのファイルを列挙しようとします。/dスイッチを使用する場合、現在のディレクトリ内のフォルダのみが列挙されるため、現在のディレクトリに10億個のフォルダがない限り、問題は発生しません。
Synetech

7

私は何兆ものファイルと話すことはできませんが、最近、以下を使用して〜180万のファイルを含む古いファイル共有を削除しました。

robocopy EmptyTMPFolder FolderToDelete /MIR /MT:16 /ETA /R:30 /W:5

「EmptyTMPFolder」は空のローカルディレクトリです。/ MIRオプションは、ターゲットをソースのように見せます(空)。

このアプローチの本当の利点は、再試行オプション(/ R:30)でした。これにより、このプロセス中に発生する可能性のある接続の問題を吸収する機会が与えられました。この方法では、ローカル削除ではメリットが得られない場合があります。

時間を比較するための特定のベンチマークはありませんが、再試行/待機オプションのb / cで提案されている他のオプションのいくつかよりもこれを好むでしょう。削除はすぐに始まりました。


大規模なネットワークドライブのフォルダツリーでクリーンアップを実行する場合、これが最も効率的な方法であることがわかりました。ヒントをありがとう。
トニー

5

すべてのフォルダを削除するには時間がかかりますが、できることはあまりありません。できることは、データを保存し、ドライブをフォーマットすることです。最適ではありませんが、動作します(そして迅速に)。

別のオプションは、おそらくNTFSパーティションから読み取ることができるライブCDでLinuxディストリビューションを使用することです。個人的な経験からrm -rf folderName、2GBのRAMを搭載したシステムをクラッシュさせることなく、少なくとも2日間実行することができます。しばらく時間がかかりますが、少なくとも終了します。


1
hm、Linux。Cygwinについて考えています。下線を引くWindows関数を使用することを想定していますが、ケースで違いが生じるかどうか疑問に思っています。やってみよう。
ジャッキーチャン

1
git bashを使用できます
雨滴

4

えーと。どうやってたくさん作ったのか知りたくない。

何が起こっているのか、Explorerは、削除を開始する前に、すべてのファイルを列挙し、情報をメモリに保存しようとしています。そして明らかに多すぎる。

コマンドを試しましたrmdir /sか?すべてのファイルが列挙されるのを待つのではなく、見つかったファイルを実際に削除する限り、機能する可能性があります。

サブディレクトリのレベルはいくつありますか?数が1つだけであるか、その他の数が少ない場合は、手動で再帰するクイックバッチファイルが機能する可能性があります。

ただし、どの方法でも時間がかかります。


もちろん、soandosの再フォーマットの提案は別として。それは高速ですが、これがシステムドライブの場合は、Windowsを再インストールする必要があります。
ボブ

プログラムが次に何を削除するかを知っているように、列挙を行わなければならないことは確かです。rmdirはファイルが見つかったときに削除できません。ファイルは先頭から開始され、何らかの方法でトラバースする必要があります。唯一の質問は、それがどれだけ過剰な情報を保存するかです。
-soandos

@soandos Explorerはすべてのファイルをカウントします。私は、DFSスタイルの列挙を実装する方法を考えていました。可能な限りブランチを下って行き、ファイルにヒットしたら削除してから、戻ってきます。言い換えれば、再帰rm -rfです。これは、比較的浅いディレクトリ構造で最適に機能します。rmdir /sこれを行うかどうかはわかりません。する必要があります。
ボブ

1
@JackeyCheung rmdir /?/s Removes all directories and files in the specified directory in addition to the directory itself. Used to remove a directory tree.つまり、/sフラグはファイルも削除します。どのように使いましたdelか?そして、そう、rm -rfsoandosが示唆したようにただ使うほうが良いかもしれません。
ボブ

1
@JackeyCheung:あなたは間違っています。rmdirに/ sフラグを指定すると、ディレクトリだけでなくファイルも削除されます。
ハリージョンストン

4

このような問題の考えられる原因の1つは、通常SAN環境で見られるシンプロビジョニングです。一部のソリッドステートドライブでも同じ問題が発生する場合があります。この場合、この構成変更により問題が解決する場合があります。

fsutil behavior set DisableDeleteNotify 1

この変更は、ソリッドステートドライブのパフォーマンスに影響を与える可能性があり、SANドライブの自動および/または手動の再シンニングを妨げる可能性があることに注意してください。


3

Shift+ Deleteごみ箱をスキップし、物事を大幅にスピードアップする可能性があります。

うまくいかない場合(極端な場合)、Fast Folder Eraserおよび/またはMass Directory Eraserを試してください。


私はイエス通常DEL、感謝と比較した場合DELは非常に高速であるシフト、画像ファイルの膨大な数を削除しようとしたときに
V-SHY

3

おそらく、ウイルス対策/マルウェア対策がすべてのメモリを消費し、システムをクラッシュさせる可能性があります。

Windows自体には、膨大な数のファイルを削除する問題はありませんが、Microsoft以外のほとんどのファイルシステムでの同様の操作よりも確かに遅いです。


いいね!見てみる価値あり。
ジャッキーチャン

ウイルス対策をオフにしましたが、以前と同様にメモリが消費されました。
ジャッキーチョン

ウイルス対策をオフにしても、プロセスの停止後にメモリを解放することはできません。
ジャッキーチョン

@JackeyCheung:どのウイルス対策プログラムですか?いくつかは実際に...完全にオフにしないでください
ベンフォークト

2

実行される可能性のある問題は、ファイル/フォルダーを削除してもディレクトリが圧縮されないため、100万個のファイルが含まれるフォルダーがあり、その最初の500kを削除する場合です。ディレクトリの先頭には、すべての意図が空白である大量のブロックがあります。

ただし、ファイルが存在する場合に備えて、エクスプローラーとコマンドプロンプトはこれらのブロックを調べる必要があります。役立つ可能性のあることは、ツリーのある場所からドライブのベースから離れた新しいフォルダーにフォルダーを「移動」し、その新しいフォルダーを削除することです。フォルダを移動しても、ポインタはフォルダに移動するだけなので、すぐに移動し、実際にはその下のすべてのファイルをドライブの新しいスペースに移動する必要はありません。

別の方法として、「PerfectDisk」などのサードパーティ製ツールを使用して、多数のファイルを削除した後にフォルダーを圧縮することもできます。


2

1000万を超えるフュージョンログファイルを削除するためのさまざまなアプローチを試してみると、平均で約3万のファイルが10分間で削除できることに気付きました。1000万個のファイルの場合、約55時間かかります...

以下のスクリプトを使用すると、削除率が〜75%増加しました。ファイルリストは、ディスク操作を増加させる同時プロセスによって作成および実行されます(ただし、線形ではありません)。4つのフォークを表示していますが、2つで十分です。

リストの準備に必要な時間を大幅に短縮するPowerShellを使用するオプションがあります。

ところで、衝突を考慮した2つの直接的なdel操作を使用してテストしましたが、単一のdel操作と比較して全体的な削除時間の顕著な減少はありませんでした。削除リストを作成することは望ましくないかもしれませんが、時間を節約する価値はありました。

@ECHO OFF
SETLOCAL EnableDelayedExpansion

IF /I "%~1"=="timestamp" (
    CALL :ECHOTIMESTAMP
    GOTO END
)

rem directory structure to delete
SET "DELETE=c:\_delete\Content.IE5\???<<<change this>>>???"
rem primary list of discovered files to delete
SET "LIST=delete-list.txt"
rem base path for sub-lists
SET "LISTBASE=.\delete-list"
SET "TITLE=Batch Delete Process"
rem specifies number of batch delete processes to spawn
SET FORKS=4
rem when set to 1, use PowerShell for list building and delete.  Definitely improves time to build fork sublists
SET POWERSHELL=0
rem specifies max files to delete when greater than 0
SET MAXDEL=1000000

rem prompt for confirmatoin
SET /P CONT=About to delete all files and directories from !DELETE!. Continue (Y/N)?
IF /I NOT "!CONT!"=="Y" EXIT /B

CALL :ECHOTIMESTAMP

ECHO Accumulating list of files to delete...
dir /b /s "!DELETE!" > "!LIST!"

FOR /F "delims=" %%c IN ('type "!LIST!" ^| find /C ":"') DO SET "COUNT=%%c"
ECHO Discoverd !COUNT! files and directories to delete.

IF  %MAXDEL% GTR 0 IF !COUNT! GTR %MAXDEL% (
    SET COUNT=%MAXDEL%
    ECHO Limiting files/directories deletion count to  !COUNT!
)

CALL :ECHOTIMESTAMP
ECHO Preparing !FORKS! delete processes...
SET /A LIMIT=!COUNT!/!FORKS!

IF !POWERSHELL! EQU 1 (
    SET SKIP=0
    FOR /L %%n IN (1,1,!FORKS!) DO (
        SET "CURRENT=!LISTBASE!-%%n.txt"
        SET "LIST[%%n]=!CURRENT!"
        DEL /f /q "!CURRENT!" > nul 2>&1
        IF %%n EQU !FORKS! SET /A LIMIT+=!FORKS!
        SET CMD=type \"!LIST!\" ^| select -first !LIMIT! -skip !SKIP!
        powershell -command "& {!CMD!}" > "!CURRENT!"
        SET /A SKIP+=!LIMIT!
    )

) ELSE (
    rem significantly slower but no PowerShell.
    SET L=1
    SET N=!LIMIT!
    SET C=0
    FOR /F %%f  IN (!LIST!) DO (
        IF !C! LSS !COUNT! (
            IF !N! GEQ !LIMIT! (
                SET "CURRENT=!LISTBASE!-!L!.txt"
                SET "LIST[!L!]=!CURRENT!"
                DEL /f /q "!CURRENT!" > nul 2>&1
                SET /A L+=1
                SET /A N=0
            ) ELSE (
                SET /A N+=1
            )
            ECHO %%f >> "!CURRENT!"
        ) ELSE (
            GOTO ENDLIST
        )
        SET /A C+=1
    )
)
:ENDLIST

CALL :ECHOTIMESTAMP
ECHO Forking !FORKS! delete processes...
FOR /L %%t IN (1,1,!FORKS!) DO (

    SET "CURRENT=!LIST[%%t]!"
    IF !POWERSHELL! EQU 1 (
        SET "TAB=        "
        SET BLANK=!TAB!!TAB!!TAB!!TAB!!TAB!!TAB!!TAB!!TAB!
        SET BLANK=!BLANK!!BLANK!!BLANK!!BLANK!
        SET DEL_CMD=del -force -recurse -ea SilentlyContinue -path \"$_\"
        SET $W_CMD=$w=$Host.UI.RawUI.WindowSize.Width
        SET $S_CMD=$s=\"$_\";$i=[math]::max^(0,$s.length-$w^);$s=$s.substring^($i, $s.length-$i^);$s=\"$s !BLANK!\";$s=$s.substring^(0,[math]::min($w,$s.length^)^)
        SET ECHO_CMD=Write-Host \"`r$s\" -NoNewLine
        SET CMD=type \"!CURRENT!\" ^| %% {!DEL_CMD!; !$W_CMD!; !$S_CMD!; !ECHO_CMD!}
        SET CMD=powershell -command "^& {!CMD!}" ^& ECHO\ ^& "%~dpnx0" timestamp
        ECHO CMD !CMD!
    ) ELSE (
        SET LOOP=FOR /F %%%f IN ^(!CURRENT!^) DO
        SET OP=del "%%%f"
        SET CMD=@ECHO OFF ^&^& ^(!LOOP! !OP!  ^> nul 2^>^&1 ^)  ^& "%~dpnx0" timestamp
    )
    rem ECHO !CMD!
    START "!TITLE! %%t" cmd /k  !CMD!
)

GOTO END

:ECHOTIMESTAMP
SETLOCAL
    SET DATESTAMP=!DATE:~10,4!-!DATE:~4,2!-!DATE:~7,2!
    SET TIMESTAMP=!TIME:~0,2!-!TIME:~3,2!-!TIME:~6,2!
    ECHO !DATESTAMP: =0!-!TIMESTAMP: =0!
ENDLOCAL
GOTO :EOF

:END
ENDLOCAL
EXIT /B

2

これを試して、必要に応じて変更してください。

これは、Synetechの技術的な説明分析に基づいたWin2003でテストされたスクリプトで、13年10月15日15:22に回答されました。

@echo off

rem ### USE FULL PATH AS FIRST ARGUMENT TO SCRIPT, DONT FORGET QUOTES !
rem ### If you move this script, fix script path variable...
SET STATICFULLSCRIPTPATH="D:\scripts\FOLDER"
SET SCRIPTNAME="DeleteFast.bat"

rem ### If CD fails or IF condition has problems,
rem ### and DEL or RMDIR runs, its better to be at safe place.
if not exist "%TEMP%\SAFE" mkdir "%TEMP%\SAFE"
if exist "%TEMP%\SAFE" cd /d "%TEMP%\SAFE"

rem ### Fix quote overflow
set var1="%1"
set var1=%var1:"=%

if not [%1]==[] (
    cd /d "%var1%"

    echo # KILLING F AT : "%var1%"
    rem ### uncomment to do damage! ### 
    rem # del /f/q * > nul

    for /d %%i in (*) do call "%STATICFULLSCRIPTPATH%\%SCRIPTNAME%" "%var1%\%%i"

    rem ## Finish deleting the last dir
    cd /d "%var1%\.."

echo # KILLING  DIR : "%var1%"
rem ## Remove dir.. first try
rmdir /q "%var1%"

if exist "%var1%" (
    rem ## Remove dir.. second try
    rem ## If thousands of files/dirs had permission/ownership problems, then prepare to wait a long time.
    rem ### uncomment to do damage! ### 
    rem #cmd.exe /c takeown /f "%var1%" && icacls "%var1%" /grant SOMEBODY:F

    rem ### uncomment to do damage! ### 
    rem #rmdir /s/q "%var1%"
)
)

cd /d "%STATICFULLSCRIPTPATH%"

Testrun .. A1からA4、B1からB4、C1からC4などのフォルダーが入れ子になっています。

Z:\>"D:\scripts\FOLDER\DeleteFast.bat" "D:\scripts\TESTF\DIRS"
# KILLING F AT : "D:\scripts\TESTF\DIRS"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A1"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A1\B1"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A1\B1\C 1"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A1\B1\C 1"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A1\B1"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A1\B2"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A1\B2\C 2"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A1\B2\C 2"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A1\B2"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A1"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A2"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A2\B3"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A2\B3\C 3"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A2\B3\C 3"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A2\B3"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A2"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A3"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A3\B4"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A3\B4\C 4"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A3\B4\C 4"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A3\B4"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A3"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A4"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A4"
# KILLING  DIR : "D:\scripts\TESTF\DIRS"

D:\scripts\FOLDER>

私はコメントできません(サイトは私の評判について文句を言います)ので、ここにコメントを追加します。

Bjvのソリューションは、無用の一時ファイルリストを作成します。そして、実際の作業を行うために2回目を繰り返します。 /superuser//a/892412/528695

元のSynetechのスクリプトは私にはうまくいきませんでした。 /superuser//a/416469/528695

@echo off
if not [%1]==[] cd /d %1
echo "%1"
for /d %%i in (*) do call %0 "%%i"

結果..

Z:\>C:\privscripts\TESTF\DeleteFastORIGINAL.bat "C:\privscripts\TESTF\DIRS"
""C:\privscripts\TESTF\DIRS""
""A1""
""B1""
""C1""
The system cannot find the path specified.
""B2""
The system cannot find the path specified.
""A2""
The system cannot find the path specified.
""A3""
The system cannot find the path specified.
""A4""

C:\privscripts\TESTF\DIRS\A1\B1\C1>

Synetechのスクリプトが機能しないと彼が言うとき、@ user4350129が正しいことを確認できます。Win7x64ボックスでも同じ動作をしました。
leinad13

私のスクリプトも完璧ではありませんでした。引数が欠落しており、引用オーバーフローが壊れた場合の問題は、takeown anc icaclsコマンドを壊しました。また、ファイルではなくフォルダのみをチェックしました。これらの問題を修正しました。
EO

2

私はFTPサーバー/クライアントを使用しているファイルを削除するためにサーバー2003でファイルを1000万と同様の時間前に同様の問題があり、クライアントがファイルとフォルダーを削除したままにしました。遅いソリューションですが、完璧に機能します。

おそらく、解決策のないNTFSのMFTに2番目の問題があります。MFTはwin 2003(Microsoftがwin 2003以降に解決策を持っているかどうかはわかりません)がすべてのファイルを増分的に格納する配列です。数兆個のファイルがあると、サイズはおかしくなります。私の場合、MFTには1700万件のレコードがあり、MFTのサイズは4GBのファイルで約19GBでした。約1 GBです。

次のコマンドを使用して、MFTのステータスを確認できます。

defrag C: /a /v
  • C: -ユニットレター
  • /a -分析する
  • /v -詳細

MFTを縮小できるツールがないため、別のトリッキーなソリューションです。ツールはファイルとプロパティの名前を0で埋めますが、それ以外は何も埋めませんが、VMwareコンバーターまたは別の種類のP2Vを使用して、サーバーで、MFTに関連するすべての問題を修正します。V2Pからの変換をテストしたことはありません。現在は仮想環境でのみ作業していますが、インターネットで多くの情報を見ました。

2003年の勝利で、MFTのサイズは40MBになり、すべてが大丈夫です。必要に応じて、何百万もの小さなファイルに関連するバックアップ、デフラグ、またはその他のタスクについて詳しく説明できます。



1

ファイルを一度に削除すると大量のメモリが使用されるため、一度に1つずつ削除する方法が必要ですが、プロセスは自動化されています。この種のことは、Unixスタイルのシェルで行う方がはるかに簡単なので、Cygwinを使用しましょう。次のコマンドは、通常のファイルのリストを生成し、そのリストを一連のrmコマンドに変換してから、結果のスクリプトをシェルにフィードします。

 find dir \! -type d | sed 's/^/rm /' | sh

スクリプトは、生成中であっても実行されており、ループがないため、シェルは(できれば)大きな一時ファイルを作成する必要はありません。スクリプトは数百万行に及ぶため、確かにしばらく時間がかかります。rmコマンドを微調整する必要があるかもしれません(おそらく私は使用すべき-fだったのでしょうか?

これで、ディレクトリ以外は何も残っていません。物事が精通する場所はここにあります。rm -rfメモリを使い果たすことなく実行できるように十分なファイルを削除した可能性があります(おそらく、他のスクリプトよりも高速です)。そうでない場合、このStackoverflowの回答を適応させることができます

 find dir | perl -lne 'print tr:/::, " $_"' | sort -n | cut -d' ' -f2 | sed 's/^/rmdir /' | sh

繰り返しますが、今回はを使用してsort、巨大な一時ファイルを作成しないように調整する必要があります。


1

しばらく前に同じ問題に遭遇しました。まさにそれを行う小さなユーティリティを作成しました。ディレクトリを再帰的に削除します。ファイルを列挙せず、多くのメモリを消費しません(最大でO(n + m)、n =最大ディレクトリ深度、m =サブディレクトリの1つの最大ファイル/ディレクトリ数)。長いファイルパス(> 256文字)を処理できます。あなたがこれであなたの問題を解決できるならば、私はフィードバックを得たいです。

ここで見つけることができます:https : //github.com/McNetic/fdeltree(releasesフォルダーで実行可能)


1

このスレッドは、サポートしているいくつかのサーバーで300万を超えるファイルを削除するよりも良い方法を探していることがわかりました。上記は複雑なIMOに対する方法であるため、Windowsで「FORFILES」コマンドラインツールを使用する既知の方法を使用することになりました(これはServer 2003にありました)。

とにかく、以下のコマンドは、フォルダー内のすべてのファイルをコマンドラインから削除するために使用したFORFILESコマンドです。

forfiles / P "ここにフォルダパス(例:C:\ Windows \ Temp)" / C "cmd / c echo @file&del / f / q @file"

上記もECHOは画面に削除されているファイルの名前ですが、何かを実際に実行したいので、何かをエコーし​​ない場合はDOSボックスがハングしているように見えますただし、期待どおりに動作します。

開始には少し時間がかかります。つまり、しばらく何もしないように見えます(約300万ファイルで約30m)が、最終的にはファイル名が削除されると表示されるようになります。また、この方法はファイルを削除するのに長い時間がかかります(エコーなしで削除時間短縮される可能性ありますか?)が、最終的にはマシンをクラッシュさせることなく機能します。 。

マウスを動かし続ける必要があるため、サーバーに自動ログオフがある場合(コンソールユーザーとして、またはLanDeskやSCCMなどの第3部のツール(またはMouseJiggle。 EXE))

とにかく、すべての幸運を祈ります!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.