web-dev-qa-db-ja.com

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

数百万のサブディレクトリと数兆のファイルを含むディレクトリがあります。そして今、私はそれをクリアする必要があります。 1兆と言っても、ファイルサイズではなく、ファイル数のことです。

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

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


[編集済み]

Cygwin rm -frで試してみましたが、同じ結果が得られました。要約すると:

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

  2. いずれかの時点で、システムに障害が発生する前に、プロセスが閉じられた場合(CTRL + Cまたはその他)、ボックスは通常どおり機能し続けます。ただし、すべての使用済みメモリが解放されるわけではありません。たとえば、システムメモリが91%に達したときにプロセスを停止したとすると、タスクマネージャは次のように通知します。4GRAM合計で、キャッシュは329M、使用可能は335MB。メモリ使用量はこのレベルのままです。マシンを再起動するまでです。タスクマネージャでエクスプローラインスタンスを停止すると、HDDライトが常にオンの状態で画面に何も表示されず、元に戻ることはありません。通常、タスクマネージャでエクスプローラインスタンスを停止すると、再度呼び出すことができます。 Win + Eを押すか、自動的に再起動しました。

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


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

22
Jackey Cheung

技術説明

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

100,000,000個のファイルしかなく、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ビットかによって、リストを保存するために25 GBから49 GBのメモリが必要になります(これは非常に重要です)簡略化された構造)。

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

解決

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

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

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

次に、現在のディレクトリ内のすべてのファイルを削除します。このモードでは、何も列挙せず、単にメモリがあれば吸い込まずにファイルを削除します。

次に、current directory内のフォルダーを列挙し、自分自身を呼び出して、各フォルダーをit(self)に渡し、下に再帰します。

分析

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

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

比較

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

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

ファイルを列挙していないので、常に最大4 × 100 = 400ディレクトリに対して、レベルごとに最大100のディレクトリ名を追跡するだけで済みます。

したがって、メモリ要件は、最新の(またはその他の)システムの制限内である〜206.25KBにする必要があります。

テスト

残念ながら(?)何百万ものフォルダに何兆ものファイルがあるシステムがないので、それをテストすることはできません(最終的には約800Kのファイルがあったと思います)。それ。

警告

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

10
Synetech

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

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

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

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

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

7
matt.bungard

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

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

5
soandos

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

fsutil behavior set DisableDeleteNotify 1

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

4
Harry Johnston

えーと。どうやってたくさん作ったのか知りたくありません。

何が起こっているのかは、エクスプローラがすべてのファイルを列挙し、削除を開始する前に情報をメモリに格納しようとしていることです。そして明らかに方法が多すぎます。

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

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

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

4
Bob

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

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

3
Tamara Wijsman

おそらく、ウイルス対策/マルウェア対策がすべてのメモリを消費し、システムをクラッシュさせているためです。

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

3
Ben Voigt

先ほどと同様の問題がありましたが、ファイル数が1,000万だけでしたが、サーバー2003では、ファイルを削除するためにftpサーバー/クライアントを使用し、クライアントにファイルとフォルダーを削除させていました。遅いソリューションですが、完璧に動作します。

おそらく、ソリューションのないNTFSのMFTで2番目の問題が発生します。MFTは、Windows 2003での配列(MicrosoftがWindows 2003以降のソリューションを持っているかどうかはわかりません)がすべてのファイルを増分的に格納しているためです。 1兆のファイルがあるとサイズがおかしくなります。私の場合、MFTには1,700万件のレコードがあり、MFTのサイズは約19GBで、45,000ファイルしかありませんでした。他のシステムでテストしたところ、MFTは100万件のレコードを探しています。約1 GBです。

次のコマンドでMFTのステータスを確認できます。

defrag C: /a /v
  • C:-単位文字
  • /a-分析
  • /v-詳細

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

その勝利2003年は完全に機能しており、MFTのサイズは40MBで問題ありません。バックアップ、デフラグ、または数百万の小さなファイルに関連するその他のタスクについて詳しく説明したい場合は、.

2

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

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

あなたが試みるかもしれないもう一つのことは、「PerfectDisk」のようなサードパーティのツールを使用して、たくさんのファイルを削除した後にフォルダをコンパクトにすることです。

2
Kelly

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

Synetechの技術説明Analysisに基づいてWin2003でテストされたスクリプトです。ソース共有作成15 10月。

@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のソリューションは、無用の一時ファイルリストを作成します。そして、実際の作業を行うためにそれらをもう一度繰り返します。 https://superuser.com/a/892412/528695

オリジナルのSynetechのスクリプトは私にはうまくいきませんでした。 https://superuser.com/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>
2
E.O

1,000万件を超えるフュージョンログファイルを削除するさまざまな方法を試したところ、平均で約30Kのファイルが10分間で削除される可能性があることに気付きました。 1,000万ファイルの場合、約55時間かかります...

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

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

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

@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
bvj

ファイルを一度に削除するとメモリが大量に消費されるため、ファイルを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

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

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

forfiles/P "YOUR FOLDER PATH HERE(e.g. C:\ Windows\Temp)"/C "cmd/c echo @file&del/f/q @file"

上記は、ECHOが画面から削除されるファイルの名前でもありますが、実際に何かの進行状況を確認したかっただけです。何かをエコーし​​ないと、DOSボックスがハングしているように見えます。それは期待通りに仕事をしているけれども。

開始には少し時間がかかります。つまり、しばらく何もしないようです(約300万ファイルの場合は約30分)。最終的には、ファイル名が削除されるにつれて、ファイル名が表示され始めます。この方法もファイルを削除するのに長い時間がかかります(削除時間mightエコーなしで削減できますか?)が、最終的にはマシンをクラッシュせずに機能します。私のサーバーでは、ファイルの〜1,850Kbを使用していました削除プロセス中のメモリ...

マウスを動かし続ける必要があるため、サーバーが自動ログオフしている場合、削除の期間によって問題が発生する可能性があります(コンソールユーザーとして実行するか、LanDeskやSCCMなど(またはMouseJiggle.exe))

とにかく、私は私の答えを共有すると思いました、すべて幸運を!

1
RatMonkey

ごと StackOverflowのこの回答delrmdirの組み合わせを使用:

del /f/s/q foldername > nul
rmdir /s/q foldername
1
Geoff

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

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

1
Nicolai Ehemann