In Anlehnung an meinen Beitrag Löschen von x Dateien/Verzeichnisse (Windows) möchte ich diesen Befehl hier noch um die Möglichkeit, eventuell entstehende leere Unterverzeichnisse rekursiv zu löschen, ergänzen. Angelehnt an Alte Dateien löschen (Praxisanwendung)unter Linux.
Um Verzeichnisse zu löschen, verwendet man in der Eingabeaufforderung den Befehl „rd“. „rd“ kann aber nur leere Verzeichnisse löschen. Verzeichnisse mit Inhalt können nicht gelöscht werden – egal ob sich darin eine Datei, oder ein weiteres leeres Verzeichnis befindet.
1 |
for /f "delims=" %d in ('dir /s /b /ad ^| sort /r') do rd "%d" |
Interessant ist hier der Aufbau des „dir“-Befehls.
dir | ||
/s | Listet auch alle Unterverzeichnisse auf | |
/b | Ausgabe in einfacher Form (ohne Kopfdaten) | |
/ad | Listet nur Verzeichnisse auf | |
| sort | ||
/r | sortiert die Ausgabe rückwärts |
Der „sort“-Befehl ist hier der wichtigte Teil.
Würde man die Verzeichnisse in der „normalen“ Weise ausgeben, so würden die Verzeichnisse von der Wurzel aus, immer tiefer absteigend, ausgegeben. Dies hätte zur Folge, dass kein Verzeichnisse, welche leere Unterverzeichnisse haben, nicht gelöscht werden könnten, da diese übergeordneten Ordner ja nicht leer sind.
Durch das Umkehren der Ausgabe mit dem „sort“-Befehl, wird mit dem untersten Verzeichnis eines Zweiges begonnen. Ist dieses leer, wird es gelöscht und die Ausgabe wird eine Ebene höher fortgesetzt. Ist dieses, durch die Löschung eines evtl vorhanden gewesenen leeren Unterverzeichnisses, nun ebenfalls leer, kann dieses gelöscht werden.
usw.
Verzeichnisse, welche nicht leer sind, werden mit der Fehlerausgabe „Verzeichnis ist nicht leer“ übersprungen.
Möchte man die Ausgabe von Fehlermeldungen unterdücken, so kann man dies durch einfaches anhängen von „2>NUL“ erledigen:
1 |
for /f "delims=" %d in ('dir /s /b /ad ^| sort /r') do rd "%d" 2>NUL |
Danke für das Script + Erklärung. Genau DAS habe ich gesucht!
Gibt es eine Möglichkeit einen bestimmten Ordner (definierten Ordner) nur zu löschen wenn dieser leer ist?
Danke im Voraus.
Gruss Michael