Windowsでファイルを大量削除する
私は、Windows 2008サーバ上の特定のサブディレクトリに300万個以上のファイルを含むディレクトリを持っています。ルートディレクトリのSHIFT+DELで手動でファイルを削除するには時間がかかります。もっと早く削除する方法はありませんか?
私は、Windows 2008サーバ上の特定のサブディレクトリに300万個以上のファイルを含むディレクトリを持っています。ルートディレクトリのSHIFT+DELで手動でファイルを削除するには時間がかかります。もっと早く削除する方法はありませんか?
警告:ディレクトリにシンボリックリンクがある場合、del
はシンボリックリンクではなく実際のディレクトリを削除します。
私は定期的にWinXPの暗号化されたドライブから大量のファイルやディレクトリを削除する必要がありますが、通常は約22GBの50万ファイルを45,000フォルダにまとめて削除します。
Windowsエクスプローラでの削除は、ファイルを列挙するのに多くの時間を無駄にしてしまうので、非常につまらないものです。いつもは削除したいものを C:\stufftodelete に移動して、deletestuff.bat のバッチファイルを rmdir /s/q C:\stufftodelete
にしている。これは夜に実行する予定だが、日中に実行することもあるので、早い方がいい。
303フォルダに960ファイル、5.85MBの小さなサンプルのクイックタイムテストの結果です。方法1を実行した後、方法2を実行し、テストディレクトリをリセットしました。
メソッド1では、1回のパスでファイルとディレクトリ構造を削除しています。
rmdir /s/q foldername
メソッド2では、1回目のパスでファイルを削除し、1つのファイルごとにスクリーンへの書き込みのオーバーヘッドを避けるためにnulに出力します。2回目のパスで残りのディレクトリ構造をクリーンアップします。
del /f/s/q foldername > nul
rmdir /s/q foldername
3,243個のフォルダにある19,521個のファイルを404MB使用した別のテスト結果です。
1回のテストで判断するには近すぎます。
編集: もっと多くのデータで再テストしましたが、これは私の典型的なケースです。
うわー、方法2は方法1の3倍近く速くなってますね! deletestuff.batを更新します!
大きなディレクトリツリーを定期的に削除する必要がある場合は、そのディレクトリツリーのルートを別のパーティションに保存し、すべてを削除する必要があるときには、それをクイックフォーマットすることを検討してください。これを自動化したい場合は、以下の DOS コマンドを使用します。
echo Y | format Z: /FS:NTFS /X /Q
ここで Z: は ‘揮発性’ パーティションです。注意: パーティションにはラベルを付けてはいけません。このことについては ここで をブログに書いています。
独自の API を使って)高速にファイルをコピー/移動できることに加えて、TeraCopy はファイルを削除することができ、それもまた高速です。TeraCopy を知って以来、(ファイルをコピー/移動/削除するのであれば)TeraCopy をインストールしていないパソコンは使わないようにしています。
同じインストーラでx64版がインストールされていますが、使用するには手動で強制的にインストールしなければなりません。
安定版よりもお勧めのベータ版。 http://blog.codesector.com/2010/09/22/teracopy-2-2-beta-3/
同じことをするバットファイルを作ってみました。
@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つのステップで動作します。もう一つは、ファイルの所有権を取得しようとすることです。yはお住まいの地域に応じて変更する必要があります(英語ではyesの略)。タスクに失敗した場合(例えば、許可のために失敗した場合)、あなたはそれを再度実行する必要があります。しかし、第二ラウンドは、最初のラウンドで削除されたファイルを削除しようとしませんので、それはかなり速くなる可能性があります。
使い方。delfolder.batとしてパスルート(例えばc:\windows)に保存して、
delfolder "foldername"
として実行してください。イェーイ!
一番現実的な解決策は、フォルダをどこかに移動させて(ごみ箱など)、削除を開始することでしょう。時間はかかりますが、少なくとも邪魔にはならないでしょう。
それらのファイルをすべて削除するのに必要な時間は、削除の実装の非効率性ではなく、タスクの固有の要件であると私は確信しています。
del /f /s /q /a foldername > nul
rmdir /s /q foldername
Magallanes によるBATファイルについて、takeownとicaclsには十分注意してください。
ツール ln.exe を使用すると、フォルダ内でハードリンクされている全てのファイルをリストアップし、それらがフォルダ外のファイル(不飽和ハードリンク)にハードリンクされているかどうかを知ることができます:
ln.exe --enum foldername > HardlinksList.txt
この2つのアプリのどちらかを試してみましたか?
[ ディスクとファイルのコピー ]0x3&
最速のパフォーマンスを得たい場合は、上書きの数を0に設定するようにしてください。これはオプションをクリックして、ダイアログの下部にある値を変更することで行います。
ソースフィールドに削除するパスを入力し、削除をクリックします。
これらのアプリはファイルをごみ箱に入れません。注意して使用してください。
これは、先に述べた回答のステップを補完するために提供されています。
上記の2つの方法は非常に効果的だと思われますが、全く同じ条件でベンチングしない限り、性能を判断するのは難しいでしょう。
その後、バッチファイルを使って設定を実行し、Powershell Cmdletを使ってログを取ってパフォーマンスを測定する
サンプルのパーティション/フォルダをデフラグして、全く同じタイプのハードドライブとして複製する
その後、バッチファイルを使って設定を実行し、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