Wie lösche ich alle Dateien, die mit einem Muster übereinstimmen (oder älter als ..), mit Ausnahme der neuesten Datei, die mit dem Muster übereinstimmt?

-1

Ich habe eine geplante Aufgabe / ein geplantes Skript, das alle 3 Stunden einen Schnappschuss einer Datei erstellt, aber die Datei wächst und der Speicherplatz ist begrenzt. Daher möchte ich jede Woche eine Bereinigung durchführen.

Was jetzt mache ich das manuell, aber ich hoffe, dass diese Aufgabe automatisiert werden kann?

Was ich genau will, ich habe ein Verzeichnis, das folgendes enthält:

 B:\>dir
 Volume in drive B is BACKUP
 Volume Serial Number is ****-****

 Directory of B:\

2015-03-04  13:04    <DIR>          MEMORYCRASHDUMPS
2015-03-02  23:59        20 484 150 [20150302235959.082]-Logs.rar
2015-03-03  00:00    <DIR>          Logs
2015-03-01  17:59        67 365 888 [20150301180000.085]-users.sqlite3
2015-03-01  22:50        67 480 576 [20150301230000.368]-users.sqlite3
2015-03-02  00:32        67 480 576 [20150302030000.378]-users.sqlite3
2015-03-02  06:22        67 503 104 [20150302080000.352]-users.sqlite3
2015-03-02  12:59        67 605 504 [20150302130000.084]-users.sqlite3
2015-03-02  17:59        67 740 672 [20150302180000.090]-users.sqlite3
2015-03-02  22:59        67 921 920 [20150302230000.418]-users.sqlite3
2015-03-03  02:58        67 960 832 [20150303030000.088]-users.sqlite3
2015-03-03  07:53        67 966 976 [20150303080000.456]-users.sqlite3
2015-03-03  12:59        68 013 056 [20150303130000.082]-users.sqlite3
2015-03-03  17:59        68 153 344 [20150303180000.081]-users.sqlite3
2015-03-03  22:54        68 339 712 [20150303230000.352]-users.sqlite3
2015-03-04  01:40        68 350 976 [20150304030000.090]-users.sqlite3
2015-03-04  07:51        68 367 360 [20150304080000.358]-users.sqlite3
2015-03-04  12:53        68 452 352 [20150304130000.085]-users.sqlite3
2015-03-04  17:58        68 718 592 [20150304180000.083]-users.sqlite3

Ich möchte alle löschen ./*-users.sqlite3, mit Ausnahme der neuesten (Bonus: Mit Ausnahme der N neuesten).

Gibt es dafür einen praktischen Windows-Befehl?

Ich habe bereits einige Fragen geprüft, obwohl sie nur das Löschen von Dateien nach Datum / Alter oder Mustern behandeln. Sie bieten jedoch keine Möglichkeit, das neueste Element auszuschließen (nur einen bestimmten Dateinamen).

Gizmo
quelle
Im Ist-Zustand fragen Sie im Grunde nur nach einem Produkt, das "X" enthält und für SU nicht zum Thema gehört.
ƬᴇcƬᴇιᴇ007
@ ƬᴇcƬᴇιᴇ007 - Dies kann mit einem einfachen Einzeiler über FOR / F mit SKIP erfolgen. Siehe meine Antwort
dbenham

Antworten:

3

Ganz einfach: Verarbeiten Sie eine Verzeichnisliste nach Datum absteigend mit FOR / F und überspringen Sie die ersten N Zeilen. Ihre Dateinamen enthalten bereits einen Zeitstempel, der ordnungsgemäß chronologisch sortiert ist, sodass Sie nach Namen sortieren können.

Im Folgenden werden die 3 neuesten Dateien beibehalten. Ändern Sie einfach den Wert für SKIP nach Bedarf.

for /f "skip=3 delims=" %F in ('dir /b /a-d /o-n "[*]-users.sqlite3"') do @del "%F"

Sie können das Obige in ein Stapelskript einfügen und den Skip-Wert parametrisieren.

purgeLog.bat

@echo off
pushd b:\
for /f "skip=%1 delims=" %%F in ('dir /b /a-d /o-n "[*]-users.sqlite3"') do del "%%F"
popd

Um die 2 neuesten Protokolle beizubehalten, verwenden Sie:

purgeLog 2
dbenham
quelle
Wenn Sie denken, dass das ein "einfacher" Einzeiler ist, nehmen Sie Drogen. :) +1
ƬᴇcƬᴇιʜ007
Lebensretter! Ich sollte mir ernsthaft Batch-Skills beibringen, die so leistungsfähig sind wie meine C ++ - Fähigkeiten.
Gizmo