web-dev-qa-db-ja.com

Windowsでファイルを一括削除する

私はディレクトリを持っています、それはWindows 2008サーバー上の特定のサブディレクトリに〜300万のファイルを含みます。ルートディレクトリでSHIFT + DELでファイルを手動で削除すると、時間がかかります。 より速く削除する方法は他にありますか?

139
aaginor

私は定期的にWinXPの暗号化されたドライブから多くのファイルとディレクトリを削除する必要があります。通常は45,000のフォルダにある500,000のファイルのおよそ22 GBです。

Windowsエクスプローラで削除すると、ファイルの列挙に多くの時間がかかるため、ゴミです。私は通常、削除する必要があるものをC:\ stufftodeleteに移動し、deletestuff.batバッチファイルをrmdir /s/q C:\stufftodeleteに持っています。これは夜間に実行するようにスケジュールされています、しかし時々私は日中に実行する必要があるので早くするほど良いです。

これは、303フォルダーに960ファイルの小さい5.85 MBのサンプルのQuick Timeテストの結果です。方法1の後に方法2を実行し、テストディレクトリをリセットしました。

方法1では、ファイルとディレクトリ構造を1回のパスで削除します。

rmdir /s/q foldername

方法2は、ファイルを削除するための最初のパスと、すべての単一ファイルに対する画面への書き込みのオーバーヘッドを回避するためのヌルへの出力を持ちます。次に2回目のパスで、残りのディレクトリ構造をクリーンアップします。

del /f/s/q foldername > nul
rmdir /s/q foldername
  • 方法1:17.5秒、14.9秒、13.9秒、14.8秒、13.8秒:平均14.98秒
  • 方法2:14.3秒、12.1秒、11.7秒、​​14.2秒、11.8秒:平均12.82秒

これは、3,243個のフォルダにある404 MBの19,521ファイルを使用した別のテストの結果です。

  • 方法1:2分20秒
  • 方法2:2分33秒

それでそれほど多くはありません、おそらく単一のテストで判断するには近すぎます。


編集:私ははるかに多くのデータで再テストしました、これは私にとって典型的なケースです:146,918フォルダの中に28.3 GBの1,159,211ファイル:

  • 方法1:2時間15分、2時間34分:平均:2時間25分
  • 方法2:49分、57分:平均:53分

うわー、方法2は方法1よりもほぼ3倍高速です! deletestuff.batを更新します。

178
Hugo

大規模なディレクトリツリーを定期的に削除する必要がある場合は、そのディレクトリツリーのルートを別のパーティションに保存してから、すべてを削除する必要があるときにただちにクイックフォーマットすることを検討してください。これを自動化する必要がある場合は、次のDOSコマンドを使用してください。

echo Y | format Z: /FS:NTFS /X /Q

z:はあなたの 'volatile'パーティションです。注:パーティションにはラベルを付けないでください。これについてブログしました ここ

18
Mr. Bungle

コマンドプロンプトで([スタート] - > [ファイル名を指定して実行] - > cmd):

del /f /s /q foldername 
9
lmsasu

(独自のAPIを使用して)ファイルを非常に速くコピー/移動することに加えて、TeraCopyはファイルを削除することができ、それも非常に高速です。 TeraCopyを見つけて以来、私はそれがインストールされていない状態でコンピュータを使用していません(私がコピー/移動/削除するつもりなら)。

同じインストーラがx64エディションをインストールしますが、それを使用するには手動で強制する必要があります。

安定版よりもお勧めのベータ版: http://blog.codesector.com/2010/09/22/teracopy-2-2-beta-3/

6
rautamiekka

私は同じことをするバットファイルを作りました。

@echo off
echo --------------------WARNING--------------------
echo folder "%~1" will be deleted
echo --------------------WARNING--------------------
pause
echo Deleting folder: "%~1".
time /T
del /f/s/q "%~1" >nul
rmdir /s/q "%~1" >nul
echo Done.
time /T
echo --- Taking ownership.
takeown /f "%~1" /r /d y >nul
icacls "%~1" /reset /t >nul
icacls "%~1" /setowner "%username%" /t >nul
echo Done all.
time /T

それは2つのステップ、1つの作業を行います、それはファイルを削除しようとします。そして2つ目は、ファイルの所有権を取得しようとすることです。 yはお住まいの地域に応じて変更する必要があります(英語でyesを意味します)。タスクが失敗した場合(たとえば、許可が原因で失敗した場合)、もう一度実行する必要があります。しかし、2回目のラウンドでは1回目のラウンドで削除されたファイルを削除しようとしないので、それはかなり速いかもしれません。


どうやって使うのですか。パスルート(たとえばc:\ windows)にdelfolder.batとして保存してから、次のように実行します。

 delfolder "foldername"   

foldernameはフォルダの名前です。

私のテストでは、123'000個のファイルを削除するのに3分かかりました(sata 7200rpm)。わーい!

6
magallanes

以下のコードを使用すると、通常私にはうまくいきます。

mkdir empty_dir
robocopy empty_dir dir_to_wipe /mir /r:0 /w:0 /e
rmdir empty_dir dir_to_wipe
4
Benoit

コマンドプロンプトから rd/sコマンド を使用します。

3
JP Alioto

最も実用的な解決策は、おそらくフォルダを邪魔にならない場所(たとえば、ごみ箱)に移動してから削除を開始することです。それは年齢がかかるでしょう、しかし少なくともそれは邪魔にならないでしょう。

これらすべてのファイルを削除するのに必要な時間は、タスクに固有の要件であり、削除の実装における非効率的なものではないと確信しています。

2
Ryan Thompson

Cygwin をインストールし、rm -rを使用してください。しかし、それはやり過ぎる可能性があります。

1
CarlF

短いファイル名の生成を有効にしていますかもしそうなら、あなたは本当にそれが必要ですか?ファイルを削除することはメタデータ操作にすぎません。そのため、削除する名前の数が2倍になった場合、作業量はかなり多くなります。

1
MSalters

あなたはこれら二つのアプリのどちらかを試したことがありますか?

最速のパフォーマンスが必要な場合は、上書き数を必ず0に設定してください。これを行うには、オプションをクリックしてから、ダイアログ下部の値を変更します。

[Source]フィールドに削除するパスを入力し、[Delete]をクリックします。

これらのアプリはファイルをごみ箱に入れません。慎重に使用してください。

0
Stephen Kellett

これは、前述の回答で取られたステップを補完および強化するために提供されています。

上記の2つの方法は非常に効果的ですが、まったく同じ条件に当てはまらない限り、パフォーマンスを判断するのは困難です。

  • 物理ハードドライブデバイスとモデル
    • できれば、ATTO/Crystal Diskがそれらのデータを複製する前にベンチマークを行った
  • 同じパーティション/ボリュームの場所とジオメトリ
    • これを行う方法は、サンプルパーティション/フォルダをデフラグし、それらが2つのまったく同じタイプのハードドライブであるように正確にクローンすることです(前のステップから)。
  • 次に、バッチファイルで設定を実行し、Powershell Cmdletを使用してパフォーマンスを記録して測定します。

    • 理想的には、同様のアクティビティが最近発生したことによるキャッシュの偏りを防ぐためのメカニズムをいくつか追加します。
  • 以下は、私が試したが決定的なパフォーマンス/結果を得ることができなかったいくつかのサンプルフォルダー(合計サイズとして命名される)です。

r.bat

rmdir /s/q 3.2G

rd.bat

del /f/s/q 3.3G > nul
rmdir /s/q 3.3G
  • 私は出力ログファイルを投稿したはずですが、フォルダファイルのサイズと分布などのために、差異は非常に大きいと思います。

Powershell:

PS S:\T> Measure-Command { S:\T\rd.bat } > rdlog.txt

PS S:\T> Measure-Command { S:\T\r.bat } > rlog.txt

PS S:\T> Measure-Command { S:\T\rd.bat } > rd_1.7G_log.txt

PS S:\T> Measure-Command { S:\T\r.bat } > r_1.8G_log.txt

PS S:\T> Measure-Command { S:\T\r.bat } > r_2.4G_log.txt

PS S:\T> Measure-Command { S:\T\rd.bat } > rd_2.7G_log.txt

PS S:\T> Measure-Command { S:\T\r.bat } > r_3.2G_log.txt

PS S:\T> Measure-Command { S:\T\rd.bat } > rd_3.3G_log.txt
0
Alex S

Hugo からの答えが最も速いのですが、最初のパスで隠しファイルやシステムファイルを削除することはないので、もっと完全な解決策が必要な場合は/ aパラメータを使用します。

del /f /s /q /a foldername > nul
rmdir /s /q foldername

Magallanes によるBATファイルについては、takeownとicaclsには細心の注意を払ってください。ハードリンクは同じパーミッションと所有者を共有するので、 がある場合takeownとicaclsを使用して、削除したいフォルダ内の/飽和ハードリンク をクリックすると、フォルダ外のファイルのアクセス権と所有者が変更されます。

ln.exe というツールを使用すると、フォルダ内にハードリンクされているすべてのファイルを一覧表示し、それらがフォルダ外のファイルにハードリンクされているかどうかを知ることができます(不飽和ハードリンク)。

ln.exe --enum foldername > HardlinksList.txt
0
liamZ