"RM-RF" -Äquivalent für Windows?

509

Ich brauche eine Möglichkeit, einen Ordner und seine untergeordneten Elemente rekursiv zu löschen.

Gibt es dafür ein vorgefertigtes Tool oder muss ich eines schreiben?

DEL /S löscht keine Verzeichnisse.

DELTREE wurde aus Windows 2000+ entfernt

FlySwat
quelle
1
Funktioniert del / s (a) überhaupt nicht (es ist nur in einigen Versionen verfügbar) oder (b) verlässt das Verzeichnis der obersten Ebene, löscht aber alles darunter oder (c) verlässt alle Verzeichnisse, während alle Dateien gelöscht werden?
wnoise
@ Aaron, antworte c, du musst rmdir / s verwenden, um Verzeichnisse und Dateien zu entfernen.
Wedge
31
Ist es format c:dann nicht wirklich die Installation von Linux? Ich scherze natürlich.
Basile Starynkevitch

Antworten:

694

RMDIR oder RD, wenn Sie die klassische Eingabeaufforderung (cmd.exe) verwenden:

rd /s /q "path"

RMDIR [/ S] [/ Q] [Laufwerk:] Pfad

RD [/ S] [/ Q] [Laufwerk:] Pfad

/ S Entfernt alle Verzeichnisse und Dateien im angegebenen Verzeichnis zusätzlich zum Verzeichnis selbst. Wird zum Entfernen eines Verzeichnisbaums verwendet.

/ Q Ruhiger Modus, fragen Sie nicht, ob es in Ordnung ist, einen Verzeichnisbaum mit / S zu entfernen

Wenn Sie Powershell verwenden , können Sie verwenden Remove-Item(was aliased zu del, erase, rd, ri, rmund rmdir) und nimmt ein -RecurseArgument , das zu Kurzschluss kann-r

rd -r "path"
Duncan Smart
quelle
84
Es sei darauf hingewiesen, dass rmdir / s / q für eine große Anzahl von Dateien in der Regel erheblich schneller ist als die entsprechende Operation "Verzeichnis auswählen, verschieben + löschen" im Explorer.
Wedge
9
Dadurch werden keine Dateien gelöscht, wie dies bei rm -rf der Fall ist, und es wird auch ein Wert ungleich Null zurückgegeben, wenn das Verzeichnis nicht vorhanden ist. Dies schlägt rd /s /q foo && echo "yay"fehl, wenn das Verzeichnis "foo" nicht vorhanden ist.
Dirk Groeneveld
17
Was ist, wenn dir. nicht leer und einige Dateien bekommen Access is deniedund andere The process cannot access the file because it is being used by another process?
Eugene
6
Ich habe es gerade in sieben versucht und Sie müssen / S und / Q (Kappen)
Ford Präfekt
2
Hier verwirrt. Ich weiß, dass ich diesen Befehl ausprobiert habe und er nicht funktioniert hat, wenn sich Dateien im Verzeichnisbaum befanden. jetzt gehe ich zurück und. . . magisch scheint es zu funktionieren. Hat jemand anderes inkonsistentes Verhalten damit?!
Alex Hall
139

Administrator:

takeown /r /f folder
cacls folder /c /G "ADMINNAME":F /T
rmdir /s folder

Funktioniert für alles, einschließlich Sys-Dateien

EDIT: Ich habe tatsächlich den besten Weg gefunden, der auch das zu lange Problem mit dem Dateipfad löst:

mkdir \empty
robocopy /mir \empty folder
wbkang
quelle
3
Mein Held! Und ein Tipp: Sie erstellen Ihren leeren Ordner unter C: \ leer, und wenn Sie sich einmal in jedem verrückten Ordner befinden, können Sie dies einfach tunrobocopy /mir c:\empty .
Léon Pelletier,
Das takeownhat mir geholfen, als ich versehentlich einen Ordner mit rsync vom Linux-System kopiert habe und keine Berechtigung hatte, diesen Ordner zu entfernen ... Nicht einmal die Robokopie hat funktioniert. Danke
Jarda
1
Sehr schöne Antwort. Es klappt. (Alle anderen Antworten auf der Seite nicht). Aber cacls ist veraltet. Ist es möglich, eine zeitgemäße Antwort zu geben? Die zweite Variante funktioniert bereits und ist nicht veraltet.
Gangnus
Das tut nichts für mich. Könnte jemand bitte erklären, wie es funktionieren soll? (Robocopy) - Es könnte den Inhalt von Ordnern löschen, aber nicht die Ordner selbst
Ralf
114

RMDIR [/S] [/Q] [drive:]path

RD [/S] [/Q] [drive:]path

  • /S Entfernt alle Verzeichnisse und Dateien im angegebenen Verzeichnis zusätzlich zum Verzeichnis selbst. Wird zum Entfernen eines Verzeichnisbaums verwendet.

  • /Q Im ruhigen Modus fragen Sie nicht, ob es in Ordnung ist, einen Verzeichnisbaum mit zu entfernen /S

Jim McKeeth
quelle
13
Danke für die Parametererklärung. Akzeptierte Antwort tut dies leider nicht.
Thomas
1
Einfachste, perfekte Antwort auf die Frage. Sollte der Akzeptierte sein.
Artif3x
19

Sie können cygwin installieren, das hat rmaber auch lsetc.

user17481
quelle
19

Gehen Sie zum Pfad und lösen Sie diesen Befehl aus.

rd /s /q "FOLDER_NAME"

/ s: Entfernt das angegebene Verzeichnis und alle Unterverzeichnisse einschließlich aller Dateien. Verwenden Sie / s, um einen Baum zu entfernen.

/ q: Führt rmdir im leisen Modus aus. Löscht Verzeichnisse ohne Bestätigung.

/? : Zeigt die Hilfe an der Eingabeaufforderung an.

Sireesh Yarlagadda
quelle
9

Verwenden Sie zum Löschen eines Verzeichnisses (unabhängig davon, ob es vorhanden ist oder nicht) Folgendes:

if exist myfolder ( rmdir /s/q myfolder )
Lehm
quelle
6

rmdir /S /Q %DIRNAME%

Branan
quelle
6

Die akzeptierte Antwort ist großartig, aber vorausgesetzt, Sie haben Node installiert, können Sie dies viel genauer mit der Knotenbibliothek "rimraf" tun, die Globbing-Muster ermöglicht. Wenn Sie dies häufig verwenden (ich tue es), installieren Sie es einfach global.

yarn global add rimraf

dann zum Beispiel ein Muster, das ich ständig benutze:

rimraf .\**\node_modules

oder für einen Einzeiler, mit dem Sie der globalen Installation ausweichen können, der für den dynamischen Download des Pakets jedoch etwas länger dauert:

npx rimraf .\**\node_modules
Artif3x
quelle
2
Eine solide Lösung für das Problem, da es betriebssystemunabhängig ist.
Denialos
5

Versuchen Sie diesen Befehl:

del /s foldername
Jeremy Ruten
quelle
arbeitete für mich in Kombination w / rmdir / s / q, da einige Dateien gesperrt waren und rmdir auf diesen fehlschlagen würde. del / foldername hat die gesperrten Dateien zerstört, wodurch rmdir das Root-Verzeichnis entfernen konnte. Nett.
Bbqchickenrobot
4

rmdir / s dirname

Brian Mitchell
quelle
4

Lassen Sie uns zunächst überprüfen, was Folgendes rm -rfbewirkt:

C:\Users\ohnob\things>touch stuff.txt

C:\Users\ohnob\things>rm -rf stuff.txt

C:\Users\ohnob\things>mkdir stuff.txt

C:\Users\ohnob\things>rm -rf stuff.txt

C:\Users\ohnob\things>ls -l
total 0

C:\Users\ohnob\things>rm -rf stuff.txt

Es gibt drei Szenarien, in denen rm -rfhäufig eine Rückkehr erwartet wird 0:

  1. Der angegebene Pfad existiert nicht.
  2. Der angegebene Pfad existiert und ist ein Verzeichnis.
  3. Der angegebene Pfad existiert und ist eine Datei.

Ich werde die ganze Sache mit den Berechtigungen ignorieren, aber niemand verwendet Berechtigungen oder versucht, sich selbst den Schreibzugriff auf Dinge in Windows zu verweigern (OK, das soll ein Witz sein…).

Setzen SieERRORLEVEL zuerst den Wert 0 und löschen Sie den Pfad nur dann, wenn er vorhanden ist. Verwenden Sie dabei unterschiedliche Befehle, je nachdem, ob es sich um ein Verzeichnis handelt oder nicht. IF EXISTwird nicht ERRORLEVELauf 0 gesetzt , wenn der Pfad nicht vorhanden ist. Daher ERRORLEVEList es erforderlich, zuerst 0 zu setzen, um den Erfolg auf eine Weise zu erkennen, die die normale rm -rfVerwendung nachahmt . Das Bewachen des RDwith IF EXISTist erforderlich, da RDim Gegensatz rm -fdazu ein Fehler ausgegeben wird, wenn das Ziel nicht vorhanden ist.

Das folgende Skript-Snippet setzt voraus, dass DELPATH vorab in Anführungszeichen gesetzt ist. (Dies ist sicher , wenn Sie so etwas wie tun SET DELPATH=%1. Versuchen Sie setzen ECHO %1in ein .cmdund es ein Argument mit Leerzeichen in es vorbei und sehen , was für sich selbst passiert). Nachdem das Snippet abgeschlossen ist, können Sie mit auf Fehler prüfen IF ERRORLEVEL 1.

: # Determine whether we need to invoke DEL or RD or do nothing.
SET DELPATH_DELMETHOD=RD
PUSHD %DELPATH% 2>NUL
IF ERRORLEVEL 1 (SET DELPATH_DELMETHOD=DEL) ELSE (POPD)
IF NOT EXIST %DELPATH% SET DELPATH_DELMETHOD=NOOP
: # Reset ERRORLEVEL so that the last command which
: # otherwise set it does not cause us to falsely detect
: # failure.
CMD /C EXIT 0
IF %DELPATH_DELMETHOD%==DEL DEL /Q %DELPATH%
IF %DELPATH_DELMETHOD%==RD RD /S /Q %DELPATH%

Der Punkt ist, dass alles einfacher ist, wenn die Umgebung nur POSIX entspricht. Oder wenn Sie ein minimales MSYS installieren und dieses einfach verwenden.

Binki
quelle
3

Hier ist was Sie tun müssen ...

Erstellen Sie eine Batchdatei mit der folgenden Zeile

RMDIR /S %1

Speichern Sie Ihre Batch-Datei als Remove.batund legen Sie sie abC:\windows

Erstellen Sie den folgenden Registrierungsschlüssel

HKEY_CLASSES_ROOT\Directory\shell\Remove Directory (RMDIR)

Starten regeditund aktualisieren Sie den Standardwert HKEY_CLASSES_ROOT\Directory\shell\Remove Directory (RMDIR)\default mit dem folgenden Wert

"c:\windows\REMOVE.bat" "%1"

Das ist es! Jetzt können Sie mit der rechten Maustaste auf ein beliebiges Verzeichnis klicken und die RMDIR-Funktion verwenden

Louis
quelle
3

Verwenden von Powershell 5.1

 get-childitem *logs* -path .\ -directory -recurse | remove-item -confirm:$false -recurse -force

Ersetzen Sie Protokolle durch den Verzeichnisnamen, den Sie löschen möchten.

get-childitem sucht rekursiv nach dem Kinderverzeichnis mit dem Namen aus dem aktuellen Pfad (.).

remove-item löscht das Ergebnis.

n_y
quelle
2

Sie können GnuWin32 installieren und * nix-Befehle nativ unter Windows verwenden. Ich installiere dies, bevor ich etwas anderes auf einer minzfrischen Kopie von Windows installiere. :) :)

Epochwolf
quelle
2

BENUTZUNG AUF EIGENE GEFAHR. INFORMATIONEN "WIE BESEHEN". NICHT UMFASSEND GETESTET.

Klicken Sie mit der rechten Maustaste auf das Windows-Symbol (normalerweise unten links)> klicken Sie auf "Windows PowerShell (Admin)"> verwenden Sie diesen Befehl (mit der gebotenen Sorgfalt können Sie alle Ihre Dateien problemlos löschen, wenn Sie nicht vorsichtig sind):

rd -r -include *.* -force somedir

Wo somedirist das nicht leere Verzeichnis, das Sie entfernen möchten?

Beachten Sie, dass sich Windows bei externen angeschlossenen Datenträgern oder Datenträgern mit Problemen manchmal merkwürdig verhält - beim Löschen (oder bei einem Kopierversuch) tritt kein Fehler auf, das Verzeichnis wird jedoch nicht wie angewiesen gelöscht (oder nicht kopiert). (Ich habe festgestellt, dass in diesem Fall, zumindest für mich, der von @n_y in seiner Antwort gegebene Befehl Fehler wie "get-childitem: Die Datei oder das Verzeichnis ist beschädigt und unlesbar" in PowerShell hervorruft.)

Roel Van de Paar
quelle
1

SPÄT, ABER WICHTIGE ANTWORT an alle, die Probleme bei der Installation von npm- Paketen auf einem Windows-Computer haben und wenn der Fehler " rm -rf..." Befehl nicht gefunden wird. Sie können die bash cli verwenden , um den Befehl rm unter Windows auszuführen.

Für npm-Benutzer können Sie die Konfiguration des npm auf npm config set script-shell "C:\Program Files\Git\bin\bash.exe"diese Weise ändern. Wenn das zu installierende npm-Paket über ein Skript nach der Installation verfügt , das den rm -rfBefehl verwendet, können Sie diesen rmBefehl ausführen, ohne Änderungen am npm-Paket vornehmen oder deaktivieren zu müssen die Konfiguration der Post-Install-Skripte. ( styled-componentsVerwendet beispielsweise den rmBefehl in den Skripten nach der Installation.)

Wenn Sie nur den rmBefehl verwenden möchten , können Sie einfach die Bash verwenden und die Argumente übergeben.

Ja, Sie können den Befehl 'rm' unter Windows verwenden.

AKC
quelle
0

Folgendes hat bei mir funktioniert:

Versuchen Sie einfach, die Länge des Pfades zu verringern. dh :: Benennen Sie alle Ordner, die zu einer solchen Datei führen, in kleinstmögliche Namen um. Sagen Sie einen Buchstaben Namen. Benennen Sie in der Ordnerhierarchie weiter nach oben um. Auf diese Weise reduzieren Sie effektiv die Pfadlänge. Versuchen Sie nun endlich, die Datei sofort zu löschen.

Gaurav Deochakke
quelle
-2

del / s / q Verzeichnis wurde gelöscht

Joe
quelle
2
Versuchen Sie, eine Beschreibung / Erklärung hinzuzufügen.
Rajen Raiyarela