2009-08-07 07:00:33 +0000 2009-08-07 07:00:33 +0000
142
142

Massenlöschen von Dateien in Windows

Ich habe ein Verzeichnis, das ~ 3 Millionen Dateien in bestimmten Unterverzeichnissen auf einem Windows 2008 Server enthält. Das manuelle Löschen der Dateien über SHIFT+DEL auf dem Stammverzeichnis dauert ewig. Gibt es eine andere Möglichkeit, das Löschen auf schnellere Weise durchzuführen?

Antworten (14)

180
180
180
2011-05-27 11:27:41 +0000

WARNUNG: wenn Sie Symlinks zu Verzeichnissen haben, dann löscht del die tatsächlichen Verzeichnisse und nicht die Symlinks. Seien Sie sehr vorsichtig damit und führen Sie diese Befehle nur aus, wenn Sie wissen, dass es keine Symlinks innerhalb des Zielverzeichnisses gibt.


Ich muss regelmäßig viele Dateien und Verzeichnisse von einem WinXP-verschlüsselten Laufwerk löschen, typischerweise etwa 22 GB mit 500.000 Dateien in 45.000 Ordnern.

Das Löschen mit dem Windows Explorer ist Quatsch, weil es viel Zeit beim Aufzählen der Dateien vergeudet. Normalerweise verschiebe ich das Zeug, das ich löschen muss, nach C:\stufftodelete und habe eine deletestuff.bat Batch-Datei nach rmdir /s/q C:\stufftodelete. Diese ist so geplant, dass sie nachts ausgeführt wird, aber manchmal muss ich sie auch tagsüber ausführen, also je schneller, desto besser.

Hier sind die Ergebnisse eines schnellen Zeittests einer kleinen 5,85 MB großen Probe mit 960 Dateien in 303 Ordnern. Ich habe Methode 1, gefolgt von Methode 2, ausgeführt und dann die Testverzeichnisse zurückgesetzt.

Methode 1 entfernt die Dateien und die Verzeichnisstruktur in einem Durchgang:

rmdir /s/q foldername

Methode 2 löscht in einem ersten Durchgang die Dateien und gibt den Wert “nul” aus, um den Overhead zu vermeiden, der durch das Schreiben auf den Bildschirm für jede einzelne Datei entsteht. In einem zweiten Durchgang wird dann die verbleibende Verzeichnisstruktur aufgeräumt:

del /f/s/q foldername > nul
rmdir /s/q foldername
  • Methode 1: 17,5s, 14,9s, 13,9s, 14,8s, 13,8s: Durchschnitt 14,98 Sekunden
  • Methode 2: 14,3s, 12,1s, 11,7s, 14,2s, 11,8s: Durchschnitt 12,82 Sekunden

Hier sind die Ergebnisse eines anderen Tests mit 404 MB von 19.521 Dateien in 3.243 Ordnern:

  • Methode 1: 2 Minuten 20 Sekunden
  • Methode 2: 2 Minuten 33 Sekunden

Es ist also nicht viel drin, wahrscheinlich zu knapp, um es anhand eines einzelnen Tests zu beurteilen.


Bearbeiten: Ich habe mit viel mehr Daten erneut getestet, dies ist ein typischer Fall für mich: 28,3 GB mit 1.159.211 Dateien in 146.918 Ordnern:

  • Methode 1: 2h 15m, 2h 34m: Durchschnitt: 2 Stunden 25 Minuten
  • Methode 2: 49m, 57m: Durchschnitt: 53 Minuten

Wow, Methode 2 ist fast dreimal so schnell wie Methode 1! Ich werde meine deletestuff.bat aktualisieren!

18
18
18
2011-10-31 06:37:53 +0000

Wenn Sie regelmäßig große Verzeichnisbäume löschen müssen, sollten Sie in Erwägung ziehen, die Wurzel dieses Verzeichnisbaums auf einer separaten Partition zu speichern und diese dann einfach schnell zu formatieren, wenn Sie alles löschen müssen. Wenn Sie dies automatisieren müssen, können Sie diesen DOS-Befehl verwenden:

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

wobei Z: Ihre “flüchtige” Partition ist. Hinweis: Die Partition darf keine Bezeichnung haben. Ich habe darüber gebloggt hier .

9
9
9
2009-08-07 07:07:04 +0000

In der Eingabeaufforderung (Start -> Ausführen -> cmd):

del /f /s /q foldername
7
7
7
2011-05-25 14:00:51 +0000

Zusätzlich zum Kopieren/Verschieben von Dateien sehr schnell (mit seiner eigenen API), TeraCopy kann Dateien löschen und es ist auch sehr schnell. Seitdem ich TeraCopy entdeckt habe, benutze ich keinen Computer mehr, auf dem es nicht installiert ist (wenn ich etwas kopieren/verschieben/löschen will).

Das gleiche Installationsprogramm installiert die x64-Edition, aber um sie zu benutzen, muss man sie manuell erzwingen.

Die Beta, die ich gegenüber den stabilen Versionen empfehle: http://blog.codesector.com/2010/09/22/teracopy-2-2-beta-3/

6
6
6
2012-02-09 17:35:24 +0000

Ich habe eine Bat-Datei erstellt, die das Gleiche tut.

@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

Es macht die Arbeit in zwei Schritten, erstens versucht es, die Dateien zu löschen. Im zweiten Schritt wird versucht, das Eigentum an den Dateien zu übernehmen. y sollte entsprechend Ihrer lokalen Einstellung geändert werden (steht für yes in Englisch). Wenn die Aufgabe fehlschlägt (z. B. wegen der Berechtigung), müssen Sie sie erneut ausführen. Die zweite Runde wird jedoch nicht versuchen, die in der ersten Runde gelöschten Dateien zu löschen, so dass es ziemlich schnell gehen könnte.


Wie man es benutzt. Speichern Sie es als delfolder.bat in einer Pfadroute (z.B. c:\windows), dann führen Sie es als

delfolder "foldername"

aus, wobei foldername der Name des Ordners

ist. In meinem Test dauerte das Löschen von 123'000 Dateien 3 Minuten (sata 7200rpm). YAY!

4
4
4
2011-12-23 15:47:15 +0000

Die Verwendung des folgenden Codes funktioniert bei mir normalerweise gut.

mkdir empty_dir
robocopy empty_dir dir_to_wipe /mir /r:0 /w:0 /e
rmdir empty_dir dir_to_wipe
3
3
3
2009-08-07 07:09:35 +0000

Verwenden Sie den Befehl rd /s an der Eingabeaufforderung.

2
2
2
2009-10-06 21:59:15 +0000

Die beste praktische Lösung ist wahrscheinlich, den Ordner irgendwo aus dem Weg zu schieben (z. B. in den Papierkorb) und dann mit dem Löschen zu beginnen. Das wird ewig dauern, aber zumindest ist er dann aus dem Weg.

Ich bin mir ziemlich sicher, dass die Zeit, die benötigt wird, um all diese Dateien zu löschen, eine inhärente Anforderung der Aufgabe ist, nicht eine Ineffizienz in der Implementierung des Löschens.

1
1
1
2009-10-06 23:45:48 +0000

Installieren Sie Cygwin und verwenden Sie rm -r. Aber das ist wahrscheinlich ein Overkill.

1
1
1
2011-05-31 12:40:36 +0000

Haben Sie die Generierung kurzer Dateinamen aktiviert? Wenn ja, brauchen Sie sie wirklich? Das Entfernen einer Datei ist nur eine Metadaten-Operation. Wenn Sie also die doppelte Anzahl von Namen zu entfernen haben, ist der Arbeitsaufwand deutlich höher.

0
0
0
2017-12-13 19:46:11 +0000

Die Antwort von Hugo ist die schnellste, aber sie entfernt versteckte oder Systemdateien nicht im ersten Durchgang, wenn Sie also eine vollständigere Lösung wünschen, verwenden Sie den Parameter /a:

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

Über die BAT-Datei von Magallanes , seien Sie sehr vorsichtig mit takeown und icacls, denn Hardlinks teilen sich dieselben Berechtigungen und Eigentümer, wenn es also ungesättigte Hardlinks in dem Ordner gibt, den Sie entfernen möchten, ändert die Verwendung von takeown und icacls die Berechtigungen und Eigentümer von Dateien außerhalb des Ordners.

Mit dem Tool ln.exe können Sie alle im Ordner verknüpften Dateien auflisten und feststellen, ob sie mit Dateien außerhalb des Ordners verknüpft sind (ungesättigte Hardlinks):

ln.exe --enum foldername > HardlinksList.txt
0
0
0
2010-04-03 16:30:58 +0000

Haben Sie eine dieser beiden Anwendungen ausprobiert?

Achten Sie darauf, die Anzahl der Überschreibungen auf 0 zu setzen, wenn Sie die schnellste Leistung wünschen. Klicken Sie dazu auf Optionen und ändern Sie den Wert unten im Dialog.

Geben Sie den zu löschenden Pfad in das Feld Quelle ein und klicken Sie dann auf Löschen.

Diese Anwendungen legen die Dateien nicht im Papierkorb ab. Verwenden Sie sie mit Vorsicht.

0
0
0
2017-06-15 12:00:52 +0000

Dies wird als Ergänzung und Erweiterung zu den Schritten in den zuvor genannten Antworten angeboten.

Die beiden oben genannten Methoden scheinen recht effektiv zu sein, aber es wäre schwierig, die Leistung zu bestimmen, wenn sie nicht unter exakt denselben Bedingungen getestet werden:

  • Physikalisches Festplattengerät und -modell
  • Vorzugsweise ATTO/Crystal Disk-Benchmarking, bevor die Daten darauf geklont werden
  • Gleiche Partitions-/Volumenposition und -geometrie
  • Um dies zu erreichen, defragmentieren Sie die Beispielpartition/Ordner und klonen Sie sie genau so, wie sie sind 2 exakt gleiche Festplattentypen (aus dem vorherigen Schritt)
  • Führen Sie dann die Konfigurationen über eine Batch-Datei aus und verwenden Sie ein Powershell-Cmdlet, um ihre Leistung zu protokollieren und zu messen.

  • Im Folgenden finden Sie einige Beispielordner (mit Angabe der Gesamtgröße), mit denen ich experimentiert habe, aber keine schlüssige Leistung / Ergebnisse erzielen konnte.

r.bat

rmdir /s/q 3.2G

rd.bat

del /f/s/q 3.3G > nul
rmdir /s/q 3.3G
  • Ich hätte die ausgegebenen Log-Dateien gepostet, aber ich glaube, dass die Varianz aufgrund der Größe und Verteilung der Ordnerdateien usw. sehr groß ist.

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
-1
-1
-1
2009-08-07 07:13:28 +0000

Das Löschen eines Ordners ist schneller als das Löschen mehrerer Dateien.

Wenn Sie also lieber die Maus statt der Eingabeaufforderung verwenden, können Sie ein Verzeichnis erstellen, Dateien dorthin verschieben und es löschen (mit Umschalt+Entf, wie Sie sagten).