web-dev-qa-db-ja.com

Windowsで大量のファイルを削除すると時間がかかる

Windowsを持っているXP NTFSディスク付きのボックスで、大量のファイルを削除すると非常に遅くなります。フォルダのツリーで多数のファイルを含むフォルダを選択して削除すると( Shift-Delを使用してごみ箱を保存します)、確認ボックスが表示されるまでに、フォルダ内のファイル数に正比例すると思われる時間がかかります。その後、フォルダ内の各ファイルを削除するのにさらに長い時間がかかります。

Windowsでフォルダーを削除し、その中のファイル数に比例して時間がかからないようにする方法はありますか?

35

Windowsでフォルダーを削除し、その中のファイル数に比例して時間がかからないようにする方法はありますか?

私はそうは思いませんが、いくつかの方法は他のものより明らかにはるかに速いです。

最悪の方法はごみ箱に送ることです。それでも削除する必要があります。次に最悪なのは、Windowsエクスプローラーでのshift + deleteです。何かを削除する前に、内容を確認するのに多くの時間を浪費します。

次善の策は、rmdir /s/q foldernameコマンドラインから。 del /f/s/q foldernameも適切ですが、ディレクトリ構造が残ります。

私が見つけた最高のものは、ファイルを削除する最初のパスとnulへの出力を備えた2行のバッチファイルで、すべての単一ファイルについて画面に書き込むオーバーヘッドを回避しています。次に、2回目のパスで残りのディレクトリ構造をクリーンアップします。

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

これは、Windowsでの時間テストに基づいて、単一のrmdirのほぼ3倍高速ですXP暗号化されたディスク、30GB/1,000,000ファイル/ 15,000フォルダの削除:rmdirは〜2.5時間、 del+rmdirには約53分かかります。詳細 ここ

これは私にとって通常のタスクなので、通常、削除する必要のあるものをC:\ stufftodeleteに移動し、それらをdel+rmdir deletestuff.batバッチファイル内のコマンド。これは夜に実行するようにスケジュールされていますが、日中に実行する必要がある場合があるので、より速い方が良いです。

62
Hugo

Hugoの元の回答を使用して、NPMプロジェクトを削除するときに使用する.batファイルを作成しました。パス変数を追加したので、パスをコピーして貼り付けるのは1回だけです。 .batファイルをダブルクリックすると、すべての作業が実行されます。すべてを入力する必要はありません。

set path="FOLDER_PATH"
del /f/s/q %path% > nul
rmdir /s/q %path%

使用例:

set path="C:\Projects\My React Project"
del /f/s/q %path% > nul
rmdir /s/q %path%
1
Halcyon

Windowsでフォルダーを削除し、その中のファイル数に比例して時間がかからないようにする方法はありますか?

ええ、はい、パーティションをフォーマットします。過去9年間にだれもそれを提案しなかったことに少し驚いています。

これはかなり過激ですが、特定のフォルダに対してこれを頻繁に行うことが予想される場合は、そのための個別のパーティションを作成する価値があるかもしれません。


それが過激すぎる場合、他の答えはあなたの唯一の希望です。なぜ serverfault なのかについては良い説明があります。これはLinuxおよびXFSファイルシステム用ですが、同じロジックがここでも適用されます。ビルトインOSの機能はあまり改善できません。

ただし、削除するすべてのファイルへのパスがわかっている場合は、ディレクトリの内容をリストする呼び出しを保存し、removeを直接呼び出すことで、オーバーヘッドを節約できます。それでもファイル数に比例します。

個人的には、プログラムが死ななかったことを自分自身で確認するために、進行状況レポートのいくつかが好きです。だから私はpython経由でものを削除するのが好きです。たとえば、すべてのファイルがサブディレクトリのない1つのディレクトリにある場合:

import tqdm
import sys
import os

location = sys.argv[1]
directory = os.fsencode(location)

with os.scandir(directory) as it:
    for dir_entry in tqdm.tqdm(it):
        try:
            os.remove(dir_entry.path)
        except OSError:
            pass  # was not a file

これにより、12歳のSEAGATE ST3250620NSで約250ファイル/秒が削除されます。私はそれがあなたのドライブではるかに速くなると思います。

ただし、現時点では、これはマイクロ最適化にすぎないため、1つのディレクトリに数百万のファイルがない限り、あまり効果がありません。 (私のように、笑、私は何をしましたかD :)

1
FirefoxMetzger

ファイルをクラウドにバックアップしていないと同時に、それらを削除しようとしていることを確認してください。

多くのクラウドバックアップソリューションでは、ファイルがバックアップされている間、ファイルがロックされ、バックアップされるのを待つ必要があります。

たとえば一時ディレクトリ(またはバックアップの必要がないもの)でこの問題が発生している場合は、バックアップセットで一時ディレクトリが選択されていないことを確認してください。

0
Simon

インストールgnutools for windowsを実行します。

find YOURFOLDER -type d -maxdepth 3 | xargs rm -Rf
0
useless