Löschen von x Dateien/Verzeichnisse (Windows)

Wie in meinen Beträgen zu Linux (Stringoperationen / Löschen der letzten x Verzeichnisse/Dateien), ist es auch unter Windows möglich Dateien nach Alter oder Anzahl zu erkennen und zu löschen. Hier leisten die Befehle „FORFILES“ und „FOR“ gute Dienste.

Möchte man Dateien, welche älter als 5 Tage sind, in einem Verzeichnis löschen, kann man den Befehl

verwenden.
Die Erklärung:

/P : Angabe des Pfadnamen
/M : ist die Suchmaske. Mit* werden alle Dateien berücksichtigt, man könnte aber auch *.log angeben oder *.mp3 usw.
/D : Angabe der Tage, hier („heute“-5) Dateien, welche älter als 5 Tage sind.
/C : Angabe des Befehls. @path sorgt für die komplette Pfadangabe für den CMD-Befehl.

Dieser Befehl ist jedoch Datums- bzw Zeitabhängig.

Möchte man eine bestimmte Anzahl von Dateien in einem Verzeichnis vorhalten, unabhängig vom Datum, so geht dies über den Befehl „FOR“.

for /f „Skip=5“ : Schleife zur Anwendung auf Dateien – überspringe die ersten 5 Treffer
dir /a-d /o-d /b …
/a-d : listet nur Dateien auf
/o-d : listet die neusten zuerst
/b : einfaches Format
Del /q : löschen ohne Nachfrage

4 Gedanken zu „Löschen von x Dateien/Verzeichnisse (Windows)“

  1. Da es im Windows-Umfeld doch immer wieder mal zu Pfaden oder Dateinamen mit Leerzeichen kommt, empfehle ich bei der FOR-Variante unbedingt mit ‚usebackq‘ zu arbeiten, dann kann man innerhalb der Klammer doppelte Anführungszeichen verwenden und somit auch mit Pfaden/Dateinamen arbeiten die Leerzeichen enthalten.

    ohne usebackq
    for /f „skip=5“ %i in (‚dir /a-D /o-d /b d:\Backup\log\*.*‘) do Del /Q %~i

    mit usebackq
    for /f „usebackq skip=5“ %i in (dir /a-D /o-d /b "d:\Pfad mit Leerzeichen\Backup\log\*.*") do Del /Q „%~i“

    Man beachte innerhalb der Klammer die Änderung von ‚ zu `. Siehe auch: FOR /?

  2. Hallo Peter.

    Danke für den Hinweis.
    Bin bei der Ausführung selber nicht auf das Problem gestoßen, aber -eben nachgesehen- hatte ich da auch keine Leerzeichen in den Pfaden/Dateinamen.

    Gruß
    Robert

  3. Wie muss man das Beispiel anpassen damit Dateien und Verzeichnisse gelöscht werden?

    -> Forfiles /P „d:\Backup\log“ /M * /D -5 /C „cmd /c del /q @path“

  4. Hallo.
    Eigentlich sollte es mit einer Abfrage auf „ist Verzeichnis“ funktionieren.
    Forfiles /P "d:\Backup\log" /M * /D -5 /C "cmd /c if @ISDIR==TRUE RD /Q /S @FILE"
    Der Parameter /S erzwingt das Löschen, auch wenn das Verzeichnis nicht leer ist.

    Die Gefahr dabei ist aber, dass evtl ein Verzeichnis schon älter sein kann, aber selber neuere Dateien beinhaltet.
    In einem solchen Fall würde ich eher einen Workaraund machen und nur die alten Dateien löschen und danach im gleichen Verzeichnis leere Ordner löschen
    Forfiles /P "d:\Backup\log" /M * /D -5 /C "cmd /c del /q @path"
    FOR /F %I IN ('dir /AD /b /s d:\Backup\log') DO rd %I

    (Bei Verwendung in Batch %I -> %%I)

    Ich hoffe, es ist der richtige Tipp dabei.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*