2009-09-11 13:38:58 +0000 2009-09-11 13:38:58 +0000
100
100

Leere Verzeichnisse unter Windows rekursiv löschen

Ich habe ein Verzeichnis auf meinem Windows 7-Rechner, das Hunderte, wenn nicht Tausende von Unterverzeichnissen hat. Einige von ihnen enthalten Dateien, andere nicht. Ich möchte alle leeren Verzeichnisse löschen.

Wenn ich mir die DOS-Befehle del und rmdir ansehe, sieht es nicht so aus, als ob man dies rekursiv tun kann, ohne alle Dateien zu löschen. Gibt es eine Möglichkeit, dies über die Befehlszeile zu tun?

Antworten (9)

121
121
121
2009-09-11 13:44:35 +0000

Sie können das Dienstprogramm Leere Verzeichnisse entfernen verwenden.

Alternativ können Sie diese Einzeiler-Batch-Datei (von DownloadSquad ) verwenden:

for /f "delims=" %d in ('dir /s /b /ad ^| sort /r') do rd "%d"

(wenn innerhalb einer Batch-Datei verwendet, ersetzen Sie %d durch %%d)

Dies funktioniert, da rd kein Verzeichnis entfernt, das Dateien enthält.

53
53
53
2015-09-13 10:25:42 +0000

Sie können auch ROBOCOPY verwenden. Es ist sehr einfach und kann auch zum Löschen von leeren Ordnern 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 Dateien in einen anderen Ordner zu verschieben. Die Option /S überspringt das Kopieren (Verschieben, im obigen Fall) leerer Ordner. Sie ist auch schneller, da die Dateien innerhalb desselben Laufwerks verschoben werden.

7
7
7
2009-09-11 16:08:08 +0000

Das kostenlose Hilfsprogramm EmptyFolderNuker erledigt dies gut, ausgehend von einem Basisordner Ihrer Wahl. Es entfernt auch die Verzeichnisse, die nur leere Unterverzeichnisse enthalten.

0
0
0
2019-12-13 04:09:18 +0000

Keine der vorherigen Antworten hat bei mir funktioniert, also habe ich die folgende Datei erstellt:

EmptyDirectoriesRemove.cmd

Inhalt:

@setlocal enableextensions enabledelayedexpansion

:walk_tree
for /D %%d in (*) do (
cd %%d
@CALL :walk_tree %%d
cd ..
rd %%d
)

endlocal

Verwendung: Wechseln Sie in das oberste Verzeichnis, das Sie bereinigen möchten. Führen Sie an der Befehlszeilen-Eingabeaufforderung aus:

EmptyDirectoriesRemove.cmd

Bei nicht leeren Verzeichnissen werden Warnungen angezeigt.

Übliche Haftungsausschlüsse: Verwendung auf eigene Gefahr. Sichern Sie vor dem Testen. usw.

0
0
0
2009-09-11 21:50:13 +0000

Wenn Sie Cygwin installiert haben, könnten Sie dies tun:

find -type d -exec rmdir {} \;
0
0
0
2018-09-02 23:41:02 +0000

Hmmm… vielleicht eine noch einfachere Lösung:

for /d /r %d in (*.*) do rd "%d"

Starten Sie dies von dem Ordner aus, aus dem leere Ordner gelöscht werden sollen.

/d - arbeitet mit Ordnern, nicht mit Dateien /r - rekursiert in Unterverzeichnissen

0
0
0
2017-04-03 09:20:06 +0000

Kombiniere Gareths und G-Man’s Beiträge:

find . -depth -type d -empty -execdir rmdir {} +

Bearbeiten: Aber das gab einen Sicherheitsfehler wegen ‘C’ in meiner PATH-Var…also stattdessen:

$find . -depth -type d -empty | while read dir; do (rmdir -v $dir); done

Ich verwende xargs nicht, weil es anscheinend ein Eingabezeilen-Limit hat (von etwa 1024 Zeilen, glaube ich?), während

while read x; do (command $x); done

einfach so lange weiterläuft, wie es Eingaben hat. Lassen Sie das ‘-v’ Verbose-Flag weg, wenn Sie die Ergebnisse nicht sehen wollen und/oder wollen, dass es schneller läuft.

0
0
0
2020-01-10 08:31:27 +0000

Die 4NT-Shell (heutzutage Take Command) hat eine /sx-Option zu “DEL”. /S ist rekursiv, das angehängte X entfernt leere Verzeichnisse.

0
0
0
2015-05-06 14:57:59 +0000

Wenn Sie in emacs arbeiten (was dies plattformunabhängig macht), funktioniert das Folgende:

(defun *-delete-empty-directories (root-directory)
  "Recursively delete empty directories in ROOT-DIRECTORY.

When called from dired, `dired-current-directory' is used for
ROOT-DIRECTORY."

  ;; Interface
  (interactive (list (if (eq major-mode 'dired-mode)
                         (expand-file-name (dired-current-directory))
                       (read-from-minibuffer "Root directory: "))))
  (when (or (null root-directory) (string= "" root-directory))
    (user-error "No root directory provided"))
  (when (called-interactively-p 'interactive)
    (unless (yes-or-no-p (format "Delete all non-empty directories in `%s'? "
                                 root-directory))
      (user-error "Directory `%s' has been left untouched" root-directory)))

  ;; Implementation
  (require 'f)
  (let ((entries (f-directories root-directory)))
    (while entries
      (let ((curdir (car entries)))
        (when (f-directories curdir)
          (*-delete-empty-directories curdir))
        (unless (f-entries curdir)
          (delete-directory curdir)
          (message "Directory deleted: `%s'" curdir))
        (setq entries (cdr entries)))))