Massenlöschung von Dateien in Windows


141

Ich habe ein Verzeichnis, das ~ 3 Millionen Dateien in bestimmten Unterverzeichnissen auf einem Windows 2008 Server enthält. Das manuelle Löschen der Dateien mit UMSCHALT + ENTF im Stammverzeichnis dauert einige Zeit. Gibt es eine andere Möglichkeit, die Löschung schneller durchzuführen?


1
Auch hier bei Stack Overflow gefragt: stackoverflow.com/questions/186737/…
Hugo

6
Wie könnte ich den Magneten nur auf einige Unterverzeichnisse ausrichten?
Jaime Hablutzel

7
@Jaime Mit einer ruhigen Hand, wie ein echter Programmierer ... ;-) xkcd.com/378
Legionair

Was ist, wenn es sich um ein SSD-Laufwerk handelt?
Benjamin Weiss

Antworten:


179

WARNUNG: Wenn Sie Symlinks zu Verzeichnissen haben, delwerden die tatsächlichen Verzeichnisse und nicht die Symlinks gelöscht. Gehen Sie dabei sehr vorsichtig vor und führen Sie diese Befehle nur aus, wenn Sie wissen, dass sich keine Symlinks im Zielverzeichnis befinden.


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

Das Löschen mit dem Windows Explorer ist Blödsinn, da das Auflisten der Dateien viel Zeit kostet. Normalerweise verschiebe ich das zu löschende Material nach C: \ stufftodelete und habe eine Stapeldatei deletestuff.bat nach rmdir /s/q C:\stufftodelete. Dies soll nachts laufen, aber manchmal muss ich es tagsüber laufen lassen, je schneller desto besser.

Hier sind die Ergebnisse eines Kurzzeittests eines kleinen 5,85-MB-Beispiels von 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 hat einen ersten Durchgang, um Dateien zu löschen und Ausgaben an nul zu senden, um den Overhead beim Schreiben auf den Bildschirm für jede einzelne Datei zu vermeiden. Ein zweiter Durchlauf bereinigt dann die verbleibende Verzeichnisstruktur:

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

Hier sind die Ergebnisse eines weiteren 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 nahe dran, um einen einzelnen Test beurteilen zu können.


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: 49 m, 57 m: Durchschnitt: 53 Minuten

Wow, Methode 2 ist fast dreimal schneller als Methode 1! Ich aktualisiere meine deletestuff.bat!


RD / S / Q funktioniert gut, wenn Sie einen absoluten Pfad angeben, aber nicht, wenn Sie mit relativen Pfaden arbeiten. Gibt es eine lösung
Michael S.

1
@ Hugo: Hugo, eine Frage: Haben Sie in den oben genannten zeitgesteuerten Tests für eine oder beide Methoden die Dateien unmittelbar vor dem Ausführen der Methode gezählt? Ich frage, weil sich der Ordnerinhalt möglicherweise bereits im Dateicache des Betriebssystems befindet. Vielen Dank!
William C

@WilliamC: Ich erinnere mich nicht genau, aber für die wiederholten Löschvorgänge mit demselben Inhalt habe ich unmittelbar vor dem Löschen nur einen gezählt und für die anderen Löschvorgänge nicht wiederholt (da ich die Nummern bereits kannte).
Hugo

1
Sowohl rmdir als auch del schlagen fehl, wenn Pfadnamen mit mehr als 256 Zeichen vorhanden sind.
Nicolai Ehemann

1
WARNUNG: Wenn Sie Symlinks zu Verzeichnissen haben, delwerden die tatsächlichen Verzeichnisse und nicht die Symlinks gelöscht. Gehen Sie dabei sehr vorsichtig vor und führen Sie diese Befehle nur aus, wenn Sie wissen, dass sich keine Symlinks im Zielverzeichnis befinden.
user0103

18

Wenn Sie regelmäßig große Verzeichnisbäume löschen müssen, sollten Sie erwägen, das Stammverzeichnis dieses Verzeichnisbaums auf einer separaten Partition zu speichern. Formatieren Sie es dann einfach schnell, 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 Beschriftung haben. Ich habe darüber hier gebloggt .


Verwenden Sie einen Hardlink, um eine Verbindung zwischen der Festplatte und dem Verzeichnis herzustellen, in dem Dateien gespeichert sind, wenn der genaue Verzeichnispfad benötigt wird.
Nime Cloud

1
@NimeCloud: Hardlinks können keine Dateisysteme oder Verknüpfungsverzeichnisse überschreiten.
Grawity

5
Symbolische Verknüpfungen können jedoch Dateisysteme und Verknüpfungsverzeichnisse überqueren, sodass sie hier möglicherweise geeignet sind. Siehe Befehl mklink (Vista und höher; ansonsten Junction von Mark Russinovich / SysInternals verwenden.)
Robert Calhoun

9

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

del /f /s /q foldername 

Das ist großartig, weil es auflistet, was gelöscht wird. Aber es ist dasselbe wie in Bezug auf die Geschwindigkeit.
Bobobobo

1
Oh woah woah woah. Nicht so gut wie ich dachte. Die Dateien werden schnell gelöscht, der Verzeichnisbaum bleibt jedoch intakt.
Bobobobo

1
Was ich vielleicht hinzufügen möchte, dauert ziemlich lange, um mit rd zu löschen.
Bobobobo

3
@bobobobo Ich habe einige Tests mit ~ 30 GB / 1.000.000 Dateien / 15.000 Ordnern durchgeführt und del + rd ist fast dreimal schneller als nur rd: superuser.com/questions/19762/mass-deleting-files-in-windows/…
Hugo

1
Dies schlägt fehl, wenn der Pfadname länger als 256 Zeichen ist.
Nicolai Ehemann

7

TeraCopy kopiert und verschiebt Dateien nicht nur sehr schnell (mithilfe seiner eigenen API), sondern löscht auch Dateien. Seit ich TeraCopy herausgefunden habe, benutze ich keinen Computer ohne diesen installiert (wenn ich kopieren / verschieben / löschen möchte).

Das gleiche Installationsprogramm installiert die x64-Edition, aber um sie zu verwenden, müssen Sie sie manuell erzwingen.

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


Haben Sie jemals Zeitvergleiche zwischen TeraCopy und rmdir oder del oder del + rmdir durchgeführt oder gesehen?
Hugo

1
@ Hugo: Dumme Frage. Ich würde TeraCopy nicht empfehlen, wenn es nicht mit bloßem Auge erkennbar wäre. Es ist schneller!
rautamiekka

5
Schätzen Sie also, dass es 10% schneller ist? Doppelt so schnell? Zehnmal so schnell? Eine Million mal schneller? Es wäre großartig, wenn Sie es gegen rmdir mit zwei großen und identischen Testsätzen messen könnten.
Hugo

1
Danke! Ich benutze TeraCopy seit Jahren, wusste aber nichts über die Massenlöschfunktion. Und du hast recht, es ist viel, VIEL schneller!
AzDayton

1
@Amalgovinus Das tust du nicht. Sie öffnen das Programm und fügen Dateien / Ordner per Drag & Drop oder Rechtsklick hinzu oder klicken mit der rechten Maustaste auf Ihre Dateien / Ordner im Explorer / auf dem Desktop. Wenn Sie fertig sind, klicken Sie einfach auf "Löschen" und "In den Papierkorb verschieben", aber ich bevorzuge "Von der Festplatte löschen". Sie müssen TeraCopy jedoch als Administrator starten, damit es in Desktop / Explorer angezeigt wird. Klicken Sie mit der rechten Maustaste, wenn dies nicht standardmäßig erfolgt.
Rautamiekka

6

Ich habe eine Fledermaus-Datei erstellt, die dasselbe 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, einem, es versucht, die Dateien zu löschen. Und die zweite ist, zu versuchen, den Besitz der Dateien zu übernehmen. y sollte entsprechend Ihrer lokalen geändert werden (Ja in Englisch). Wenn die Aufgabe fehlschlägt (z. B. wegen fehlgeschlagener Berechtigung), müssen Sie sie erneut ausführen. In der zweiten Runde wird jedoch nicht versucht, die in der ersten Runde gelöschten Dateien zu löschen, daher kann dies recht schnell gehen.


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

 delfolder "foldername"   

Dabei ist Ordnername der Name des Ordners

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


1
Normalerweise solltest du %1in einem Skript aber nicht verwenden "%~1". Auf diese Weise wird das Argument, wenn es mit Anführungszeichen übergeben wurde, deklassiert und erneut zitiert. Wenn es nicht mit Anführungszeichen übergeben wurde, wird es in Anführungszeichen gesetzt.
Benoit

4

Der folgende Code funktioniert normalerweise gut für mich.

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

Fügen Sie am Ende dieses Robocopy-Aufrufs ein `> nul` hinzu, damit Sie es nicht auf dem Bildschirm sehen müssen.
JoshDM

Es ähnelt der Verwendung unter rsyncLinux. Dann ist es hier sogar schneller rmdir?
Hastur

Zu Ihrer Information, diese Robokopie unterscheidet sich sehr von del /f/q/s+ rmdir /s/q. Wenn dein dir_to_wipe mit dir in Verbindung steht, gehen c:\some_important_dirdeine Daten verloren.
Pavel P

@Pavel dann mit / XJ Knotenpunkte und symbolische Verknüpfungen ausschließen?
Bernhard

Dies war der Trick für ein ~ 36 GB-Verzeichnis mit Hunderten von Verzeichnissen und Dateien mit mehr als 256 Zeichen, was dazu führte, dass die del / rmdir-Methode kläglich fehlschlug. Dies dauerte Sekunden, Windows Explorer schätzte die STUNDEN!

3

Verwenden Sie den Befehl rd / s an der Eingabeaufforderung.


2
Nein. Dies ist so langsam wie das Löschen aus dem Explorer.
Bobobobo

Nun, es ist in Ordnung. Funktioniert sowieso besser als del / f / s / q.
Bobobobo

3
Das ist VIEL besser als das Löschen mit dem Explorer. Es wird weiterhin gelöscht, auch wenn ein oder zwei Löschvorgänge fehlschlagen (Explorer drosselt und bricht ab)
Bobobobo

2

Die praktischste Lösung ist wahrscheinlich, den Ordner an eine andere Stelle zu verschieben (z. B. in den Papierkorb) und ihn dann zu löschen. Es wird Ewigkeiten dauern, aber zumindest wird es aus dem Weg gehen.

Ich bin mir ziemlich sicher, dass die zum Löschen all dieser Dateien erforderliche Zeit eine inhärente Anforderung der Aufgabe ist und keine Ineffizienz bei der Implementierung des Löschvorgangs.


1

Installieren Sie Cygwin und verwenden Sie rm -r . Aber das ist wahrscheinlich übertrieben.


Das ist genau das gleiche wie rd /q /s...
Joey

Zu viel Arbeit und fast die gleiche Geschwindigkeit!
Adeelx

1
Es ist nicht schlimmer als die vielen anderen Antworten, die Install-Tool-X-and-Use-It hier gibt, und sollte nicht abgelehnt werden, wenn sie nicht vorhanden sind.
JdeBP

2
Ist cygwin rmwirklich so schnell wie cmd.exe eingebaut rd? Da die Cygwin-Emulation der Posix-Schnittstelle ziemlich langsam ist, da sie einige zusätzliche Arbeiten erfordert, wird rmdies nicht wirklich gewürdigt.
Jan Hudec

Während ich darauf wartete, dass eine große Sammlung von Dateien gelöscht wurde, hatte ich genug Zeit, Cygwin zu installieren und es zu versuchen rm -rf. Ungefähr 10 Minuten später brach ich ab und ging zurück zu, del /f/s/qda unter Cygwin die Festplattenauslastung nur 50% betrug. Unter delist die Datenträgernutzung auf 100% festgelegt. Ich denke also, es muss schneller gelöscht werden. Die CPU-Auslastung liegt bei beiden Methoden bei <1%. Ich bin mir bei der Dateinummer nicht sicher, da ich den Windows File Deleter nach 10-minütiger Berechnung geschlossen habe.
Derek Ziemba

1

Haben Sie die Kurznamengenerierung aktiviert? Wenn ja, brauchen Sie das wirklich? Das Entfernen einer Datei ist nur eine Metadatenoperation. Wenn Sie also doppelt so viele Namen entfernen müssen, ist der Arbeitsaufwand erheblich höher.


0

Haben Sie eine dieser beiden Apps ausprobiert?

Stellen Sie sicher, dass die Anzahl der Überschreibungen auf 0 eingestellt ist, wenn Sie die schnellste Leistung erzielen möchten. Klicken Sie dazu auf Optionen und ändern Sie den Wert unten im Dialogfeld.

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

Diese Apps legen die Dateien nicht im Papierkorb ab. Mit Vorsicht verwenden.


0

Dies wird bereitgestellt, um die in den zuvor erwähnten Antworten unternommenen Schritte zu ergänzen und zu ergänzen.

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

  • Physisches Festplattengerät & Modell
    • Vorzugsweise wird ATTO / Crystal Disk vor dem Klonen der Daten darauf einem Benchmarking unterzogen
  • Gleiche Partition / Volume Position & Geometrie
    • Der Weg, dies zu tun, wäre, die Beispielpartition / Ordner zu defragmentieren und genau so zu klonen, wie es 2 genau die gleichen Festplattentypen sind (vom vorherigen Schritt).
  • Führen Sie dann die Konfigurationen über die Stapeldatei aus und verwenden Sie das Powershell-Cmdlet, um deren Leistung zu protokollieren und zu messen.

    • Fügen Sie im Idealfall einige Mechanismen hinzu, um zu verhindern, dass Caching-Verzerrungen auftreten, wenn ähnliche Aktivitäten erneut auftreten.
  • Im Folgenden sind einige Beispielordner (als Gesamtgröße bezeichnet) aufgeführt, an denen ich experimentiert habe, die jedoch keine aussagekräftigen Ergebnisse liefern konnten.

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 Ausgabeprotokolldateien gepostet, aber ich glaube, die Abweichung ist aufgrund der Größe und Verteilung der Ordnerdateien usw. sehr groß.

Power Shell:

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

schlägt mit Namen> 256 Zeichen fehl

0

Die Antwort von Hugo ist die schnellste, entfernt jedoch keine versteckten Dateien oder Systemdateien im ersten Durchgang. Wenn Sie also eine umfassendere 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-Dateien. Hardlinks haben dieselben Berechtigungen und Eigentümer. Wenn sich also ungesättigte Hardlinks in dem Ordner befinden, den Sie entfernen möchten, ändern takeown- und icacls-Dateien die Berechtigungen und Eigentümer von Dateien außerhalb des Ordners die Mappe.

Mit dem Tool ln.exe können Sie alle Dateien auflisten, die innerhalb des Ordners fest verbunden sind, und feststellen, ob sie mit Dateien außerhalb des Ordners fest verbunden sind (ungesättigte Hardlinks):

ln.exe --enum foldername > HardlinksList.txt

-1

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

Wenn Sie also lieber die Maus als die Eingabeaufforderung verwenden möchten, können Sie ein Verzeichnis erstellen, Dateien dorthin verschieben und löschen (wie gesagt mit Umschalt + Entf).


2
Das Verzeichnis sollte auf derselben Partition erstellt werden, auf der sich die Dateien befinden. Dadurch wird die Bewegungsaktion sofort ausgeführt. Wenn sich der neue Ordner und die Dateien auf separaten Partitionen befinden, dauert der gesamte Kopiervorgang sehr lange.

5
Woher kommt die Idee, dass das Löschen eines Ordners schneller ist als das Löschen der darin enthaltenen Dateien? Das Löschen eines Ordners beinhaltet als ersten Schritt das Löschen aller Dateien in diesem Ordner, so dass es nicht schneller sein kann. Der Umzug in den Papierkorb ist eine ganz andere Sache, aber das ist hier nicht die Frage.
Joey
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.