Wie lösche ich leere Ordner mit der Windows-Eingabeaufforderung?

76

Ich muss alle leeren Ordner über die Windows-Eingabeaufforderung aus meinem Anwendungsordner löschen.

Wie kann ich so eine Fledermausdatei erstellen?

Bitte hilf mir.

ENTWICKELT
quelle

Antworten:

53
for /f "usebackq" %%d in (`"dir /ad/b/s | sort /R"`) do rd "%%d"

von: http://blogs.msdn.com/b/oldnewthing/archive/2008/04/17/8399914.aspx

Natürlich würde ich es zuerst testen, ohne es zu löschen, bevor ich diesen Befehl ausführe. Hier ist auch eine modifizierte Version aus den Kommentaren, die Ordner mit Leerzeichen enthält:

 for /f "usebackq delims=" %%d in (`"dir /ad/b/s | sort /R"`) do rd "%%d"

PS: Es gibt weitere Kommentare im Blog-Beitrag, die Ihnen helfen könnten. Lesen Sie diese auch, bevor Sie dies ausprobieren

korrodiert
quelle
1
Ich mag diesen. Der Link hier erwähnt, dass dieser einfacher ist (ähnlich dem folgenden):for /f "tokens=*" %%d in ('dir /ad/b/s ^| sort /R') do rd "%%d"
Brad W
Wo legen Sie den Pfad zu Ordnern ab?
MAGx2
1
@ MAGx2 Ich hatte auch diese Frage. Ich kann nicht herausfinden, wie man Backquotes in den Kommentaren veröffentlicht, aber ich verwende ([backquote] dir / ad / b / s "c: \ path" [backquote])
Jason
1
Wenn Sie die Zeile nicht über Datei in einer Charge verwenden , dann müssen Sie ersetzen %%dmit%d
svandragt
1
Mit ROBOCOPY ist dies problemlos möglich. Siehe meine Antwort unten für Details.
Varun Sharma
125

Sie können den ROBOCOPYBefehl verwenden. Es ist sehr einfach und kann auch zum Löschen leerer Ordner innerhalb einer großen Hierarchie verwendet werden.

ROBOCOPY folder1 folder1 /S /MOVE

Hier sind sowohl Quelle als auch Ziel folder1, da Sie nur leere Ordner löschen müssen, anstatt andere (erforderliche) Dateien in einen anderen Ordner zu verschieben. /SOption ist das Überspringen des Kopierens (Verschieben - im obigen Fall) leerer Ordner. Dies ist auch schneller, da die Dateien auf demselben Laufwerk verschoben werden.

Varun Sharma
quelle
1
Ich liebe die Robocopy-Lösung. VIELEN DANK!
Buzzy Hopewell
1
Sehr schön! +1 für die Antwort.
JasonXA
1
Lebensretter Antwort.
John Woo
1
OK, das scheint großartig und funktioniert! Ich verstehe nur nicht, warum, wenn das cmd aus dem Projektordner ausgeführt wird, "ERROR 32 (0x00000020) Quellverzeichnis löschen" angezeigt wird - was bedeutet, dass das Hauptverzeichnis nicht gelöscht werden kann! Gott sei Dank kann es nicht gelöscht werden, weil es nicht soll - es ist nicht leer! ("Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird." - wobei die Datei das Verzeichnis sein muss). Ich renne hinein mit: Robocopy. . / s / bewegen.
Pedro Reis
1
@PedroReis Meiner Meinung nach wird dieser Fehler angezeigt, wenn Sie versuchen, ihn zu löschen / zu verschieben, während die untergeordnete Datei / der untergeordnete Ordner noch geöffnet ist. Wenn Sie weitere Hilfe benötigen, ist es meiner Meinung nach besser, diese als neue Frage zu veröffentlichen, damit andere, die mit diesem Problem konfrontiert sind, Ihre Frage finden und ihr Problem lösen können.
Varun Sharma
58

Eine einfachere Möglichkeit besteht darin, mit xcopy eine Kopie der gesamten Verzeichnisstruktur mit dem Schalter / s zu erstellen. Hilfe für / s sagt Kopiert Verzeichnisse und Unterverzeichnisse mit Ausnahme von leeren.

xcopy dirA dirB /S

Dabei ist dirA die Quelle mit leeren Ordnern. DirB ist die Kopie ohne leere Ordner

Dinesh Rajan
quelle
1
Dies sollte die akzeptierte Antwort sein. Schön und einfach! Vielen Dank!
eckes
4
Wenn Sie den Schalter / I xcopy dirA dirB /SIhinzufügen, wird beispielsweise die Eingabeaufforderung "Gibt dirB einen Dateinamen oder Verzeichnisnamen auf dem Ziel an?" Übersprungen.
Luke Sampson
28
Ich bin damit einverstanden, dass dies einfach ist, aber ich habe eine Verzeichnisstruktur mit über 1 TB Daten. Ich möchte das nicht wiederholen!
JYelton
Mit RoboCopy können Sie etwas Ähnliches tun und keine leeren Ordner kopieren. Ich nehme an, nützlich, wenn Sie Daten kopieren, aber nicht, wenn Sie leere Ordner entfernen möchten.
So
4
Beachten Sie
16

Sie brauchen usebackq nicht:

FOR /F delims^= %%A IN ('DIR/AD/B/S^|SORT/R') DO RD "%%A"
tomasz86
quelle
5
Danke Tom ... du hast recht. In einer Befehlszeile wird jedoch tatsächlich ein einzelnes% gegenüber einer Batchdatei verwendet. Benutzer: Beachten Sie, dass RD weder Dateien noch Verzeichnisse löscht, die Dateien enthalten. einfach leere Verzeichnisse. Es ist also absolut sicher. FOR / F-Delims ^ =% A IN ('DIR / AD / B / S ^ | SORT / R') DO RD "% A"
Wenn Sie cygwin verwenden, stellen Sie sicher, dass Sie Ihre Pfadreihenfolge überprüfen oder SORT explizit auf die dos-Version verweisen.
So
8

Zu der korrodierten Antwort auf derselben Seite, auf die verwiesen wird, gehört eine PowerShell-Version http://blogs.msdn.com/b/oldnewthing/archive/2008/04/17/8399914.aspx#8408736

Get-ChildItem -Recurse . | where { $_.PSISContainer -and @( $_ | Get-ChildItem ).Count -eq 0 } | Remove-Item

oder, genauer gesagt,

gci -R . | where { $_.PSISContainer -and @( $_ | gci ).Count -eq 0 } | ri

Gutschrift geht an den Buchungsautor

BozoJoe
quelle
3

Dies ist ein Hybird der oben genannten. Es entfernt ALLE Dateien, die älter als X Tage sind, und alle leeren Ordner für den angegebenen Pfad. Zur Verwendung legen Sie einfach die Tage, den Ordnerpfad und das Laufwerk fest

@echo off
SETLOCAL
set days=30
set folderpath=E:\TEST\
set drive=E:

::Delete files
forfiles -p %folderpath% -s -d -%days% -c "cmd /c del /q @path "

::Delete folders
cd %folderpath%
%drive%
for /f "usebackq delims=" %%d in (`"dir /ad/b/s | sort /R"`) do rd "%%d"`
jcwhall
quelle
gut, aber ich muss Apostrof am Ende der letzten Zeile für / f "usebackq delims =" %% d in ( "dir /ad/b/s | sort /R") do rd "%% d" entfernen
integratorIT
3

über die Befehlszeile: für / R / D% 1 in (*) rd "% 1"

in einer Batchdatei für / R / D %% 1 in (*) rd "%% 1"

Ich weiß nicht, ob es als solches dokumentiert ist, aber es funktioniert in W2K, XP und Win 7. Und ich weiß nicht, ob es immer funktioniert, aber es wird niemals versehentlich Dateien löschen.

Oglethorpe Cadwallader
quelle
1

Installieren Sie einen UNIX-Interpreter für Windows (Cygwin oder Git Bash) und führen Sie den Befehl cmd aus:

find / path / to / directory -empty -type d

To find them

find / path / to / directory -empty -type d -delete

To delete them

(Nicht wirklich mit der Windows-Cmd-Eingabeaufforderung, aber es ist einfach und dauerte einige Sekunden, um ausgeführt zu werden)

GreAce
quelle
Plus zehn für die Angabe, wie man sie einfach findet .
Bob Stein
In meiner Version von find funktioniert der erste Befehl, aber beim Hinzufügen von -delete steht "ungültiges Prädikat -delete"
OMA
1

Es wird gut funktionieren. Dies ist der beste Weg, um alte Dateien zu löschen und leere Verzeichnisse rekursiv zu entfernen. Die folgende .bat-Datei lautet:

forfiles /p [PATH] /s /m [FILE-PATTERN] /d -[DAYS] /c "cmd /c del @path"
for /f "delims=" %%d in ('dir [PATH] /s /b /ad ^| sort /r') do rd "%%d"

Die Platzhalter müssen wie folgt ersetzt werden (ohne Anführungszeichen):

[DAYS] = Max. age of the files in days, e.g. “10”
[PATH] = Path to search for old files and empty folders, e.g. “C:\Backup\”
[FILE-PATTERN] = Pattern that matches files to delete, e.g. “*.bkp”

Das Skript wurde erfolgreich unter Windows 7 und Windows Server 2003 getestet.

Sathish Anish
quelle
0
@echo off
set /p "ipa= ENTER FOLDER NAME TO DELETE> "
set ipad="%ipa%"
IF not EXIST %ipad% GOTO notfound
IF EXIST %ipad% GOTO found
:found
echo DONOT CLOSE THIS WINDOW
md ccooppyy
xcopy %ipad%\*.* ccooppyy /s > NUL
rd %ipad% /s /q
ren ccooppyy %ipad%
cls
echo SUCCESS, PRESS ANY KEY TO EXIT
pause > NUL
exit 
:notfound
echo I COULDN'T FIND THE FOLDER %ipad%
pause
exit
PRADEESH
quelle
0

Wenn Sie die ROBOCOPY-Befehlszeile von Varun im Explorer-Kontextmenü verwenden möchten (dh mit der rechten Maustaste klicken), finden Sie hier einen Windows-Registrierungsimport. Ich habe versucht, dies als Kommentar zu seiner Antwort hinzuzufügen, aber das Inline-Markup war nicht möglich.

Ich habe dies auf meinem eigenen Windows 10-PC getestet, benutze es jedoch auf eigenes Risiko. Es wird eine neue Eingabeaufforderung geöffnet, der Befehl ausgeführt und angehalten, damit Sie die Ausgabe sehen können.

  1. In eine neue Textdatei kopieren:

    Windows Registry Editor Version 5.00

    [HKEY_CURRENT_USER \ Software \ Klassen \ Verzeichnis \ Hintergrund \ Shell \ Leere Ordner löschen \ Befehl] @ = "C: \ Windows \ System32 \ Cmd.exe / C \" C: \ Windows \ System32 \ Robocopy.exe \ "% V. "% V" / s / move "&& PAUSE"

    [HKEY_CURRENT_USER \ Software \ Klassen \ Verzeichnis \ Shell \ Leere Ordner löschen \ Befehl] @ = "C: \ Windows \ System32 \ Cmd.exe / C \" C: \ Windows \ System32 \ Robocopy.exe \ "% V \" "% V" / s / move "&& PAUSE"

  2. Benennen Sie die Erweiterung .txt in .reg um

  3. Doppelklicken Sie zum Importieren.
Casey Plummer
quelle
Vielen Dank, dass Sie Varun Sharma für das Original.
Casey Plummer
-1

Nun, nur ein schneller und schmutziger Vorschlag für eine einfache 1-Ebenen-Verzeichnisstruktur ohne Leerzeichen [Bearbeiten] und für Verzeichnisse, die nur EINEN Dateityp enthalten, den ich nützlich fand (irgendwann von http://www.pcreview.co.uk) /forums/can-check-if-folder-empty-bat-file-t1468868.html ):

for /f %a in ('dir /ad/b') do if not exist %a\*.xml echo %a Empty

/ ad: zeigt nur Verzeichniseinträge an
/ b: nacktes Format verwenden (nur Namen)

[Bearbeiten] Die Verwendung eines einfachen Sterns zum Überprüfen auf JEDE Datei (% a \ * oben) funktioniert nicht, danke für die Korrektur

Daher wäre das Löschen:

for /f %a in ('dir /ad/b') do if not exist %a\*.xml rmdir %a
hallo_erd
quelle
1
Der obige Test besteht auch dann, wenn das Verzeichnis leer ist.
Steve Hollasch
@SteveHollasch danke für den Kommentar, ich habe den Code oben korrigiert
hallo_earth