it-swarm.com.de

Rekursives Löschen leerer Verzeichnisse in Windows

Ich habe ein Verzeichnis auf meinem Windows 7-Computer, das Hunderte, wenn nicht Tausende von Unterverzeichnissen enthält. Einige von ihnen haben Dateien, andere nicht. Ich möchte alle leeren Verzeichnisse löschen.

Wenn Sie den DOS-Befehl del und rmdir betrachten, sieht es nicht so aus, als könnten Sie dies rekursiv tun, ohne alle Dateien zu löschen. Gibt es eine Möglichkeit, dies von der Befehlszeile aus zu tun?

87
mohlsen

Sie können das Dienstprogramm Leere Verzeichnisse entfernen verwenden.

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

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

(Falls in einer Batch-Datei verwendet, ersetzen Sie %d durch %%d)

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

106
caliban

Sie können auch ROBOCOPY 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 Dateien in einen anderen Ordner zu verschieben. Die Option /S überspringt das Kopieren (Verschieben, in diesem Fall) von leeren Ordnern. Es ist auch schneller, wenn die Dateien in dasselbe Laufwerk verschoben werden.

41
Varun Sharma

Da Cygwin mit GNU find geliefert wird, können Sie dies tun:

find . -type d -empty -delete

Oder um das Rauschen zu vermeiden, wenn ein Ordner nicht mehr vorhanden ist:

find . -type d -empty -execdir rmdir {} +
15
Michael

Das kostenlose Dienstprogramm EmptyFolderNuker erledigt dies in einem Basisordner Ihrer Wahl. Es werden auch diejenigen Verzeichnisse entfernt, die nur leere Unterverzeichnisse enthalten.

6
Rob Kam

Das exzellente Glary Utilities hat dies und eine Reihe anderer großartiger Funktionen.

1
outsideblasts

Wenn Sie in Emacs arbeiten (was diese Plattform-unabhängig macht), funktioniert Folgendes:

(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)))))
0
Sean Allred

Hmmm ... vielleicht noch einfachere Lösung:

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

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

/ d - Arbeitet mit Ordnern, nicht mit Dateien./r - Wiederholt Unterverzeichnisse

0

Zusammenfassung der Beiträge von Gareth und G-Man:

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

Edit: Aber das gab einen Sicherheitsfehler wegen 'C' in meinem PATH var ... also stattdessen:

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

Ich verwende keine xargs, da es anscheinend ein Eingabezeilenlimit gibt (von ungefähr 1024 Zeilen, denke ich?), Wohingegen

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

macht einfach so lange weiter, wie es Input hat. Lassen Sie das ausführliche Flag "-v" weg, wenn Sie die Ergebnisse nicht sehen und/oder schneller ausführen möchten.

0
skeetastax

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

find -type d -exec rmdir {} \;
0
Anthony Giorgio