user2009
Goto Top

Im Backupordner mittels cmd alle Backups, außer den letzen drei löschen

Bisher werden Daten unregelmäßig in einen Ordner "name_YY-MM-TT_h-i" gesichert (mittels 7zip oder robocopy).
Nun sollen ab und an die alten Backups gelöscht werden, aber nicht nach Zeit (alles was älter als 7 Tage ist weg), sondern es sollen die aktuellsten X (z.B. 3) Backupordner erhalten bleiben.

Hallo zusammen!

Bisher werden Daten unregelmäßig in einen Ordner "name_YY-MM-TT_h-i" gesichert (mittels 7zip oder robocopy).
Nun sollen ab und an die alten Backups gelöscht werden, aber nicht nach Zeit (alles was älter als 7 Tage ist weg), sondern es sollen die aktuellsten X (z.B. 3) Backupordner erhalten bleiben.

Bisher wird mit 7za.exe, GetAllDateTimeInfos.cmd und dieser cmd gesichert :
@echo off
:start
CLS
setlocal

::  DateTime von Biber version 0.08
set DateTime=
Call GetAllDateTimeInfos /s
set "DateTime=%JJ%-%MM%-%TT%__%hh%-%min%"  
Call GetAllDateTimeInfos /u

If /i [%1]==[/?] goto Syntax 

:: zum Testen die verzeichnisstruktur kopieren
:: xcopy e:\daten e:\daten_test /t /e

: * ZIEL *

set "Bak_Ordner1=e:\daten_bak\Daten_7z"  
md %Bak_Ordner1%\%DateTime%
set "Bak_Ordner2=e:\daten_bak\%DateTime%"   
set "Destination=%Bak_Ordner2%\daten.7z"  

: * QUELLE *
set "Source=e:\daten\*"  

: * INCLUDE *
set "Include=@include.lst"  
:: INHALT include.lst
rem #kommentar
rem E:\Daten1\
rem E:\Daten2\

: * EXCLUDE *
rem list files: UTF-8 is default encoding | -scs switch
set "Exclude=@exclude.lst"  
::set "Exclude=@\path\sub\exclude.lst" 
:: INHALT exclude.lst
rem #kommentar
rem temp\
rem #private Ordner, die "privat" im Namen haben, ausschliessen  
rem *Privat\*

REM * GROESSE DER ZIPs *
set "Groesse=1024" rem ... in Megabyte  


:Suche1
color 0A
echo.
echo Daten in Paketen zu jeweils %Groesse% MB packen:
echo ............................................ && echo.

7za a -t7z -bd -r "-ir%Include%" "-xr%Exclude%" -scsWIN -v%Groesse%m %Destination% %Source%  
rem a ... add
rem -t7z | -tzip ... Format
rem -bd ... prozentuale Fortschrittsanzeige aus (schneller?)
rem -r ... Verzeichnisse rekursiv abarbeiten
rem -scs{UTF-8 | WIN | DOS} ...Sets charset for list files
rem -ai[r[-|0]]{@listfile|!wildcard}: Include archives
rem -ax[r[-|0]]{@listfile|!wildcard}: eXclude archives

: * LIST archiv *
rem bei multivolume archiven immer die erste datei mit 7z aufrufen
:: 7za l E:\Daten_Bak\Daten_7z\2010-01-11__16-51\daten.7z.001

: * EXTRACT *
:: 7za x E:\Daten_Bak\Daten_7z\2010-01-11__16-51\daten.7z.001 -oe:\Ordner1 *.log -r
rem alle log-daten nach e:\Ordner1 entpacken

:DELETE
call del

endlocal
:: echo. && pause && echo. && echo.


:EOF
pause>nul

::DELETE
:DEL
::set "Del_Ordner=e:\daten_bak\Daten_7z" 
set "Del_Ordner=%Bak_Ordner1%"  
if not exist e:\Temp_bak md e:\Temp_bak

robocopy %Del_Ordner%\ e:\Temp_bak\  /minage:7  /XJ
:: /MAXAGE:n :: MAXimum file AGE - exclude files older than n days/date.
:: /MINAGE:n :: MINimum file AGE - exclude files newer than n days/date.

rem --->
rem dauert viel zulange und frisst ressourcen
rem wenn in den den letzen 7 tagen kein backup lief, dann ist alles weg :-(

rd "e:\Temp_bak\" /S /Q  
rem löschen mit remove directory ...
:: für Dateien:
:: del e:\Temp_bak\
:: del "Zielpfad\*.* /S /F 
:: /S == Unterverzeichnisse
:: /F == Löschen erzwingen


Hat jemand bitte einen Vorschlag....

Viele Grüße
user09

Content-Key: 133243

Url: https://administrator.de/contentid/133243

Printed on: April 23, 2024 at 15:04 o'clock

Member: TheDarkLord
TheDarkLord Jan 12, 2010 at 12:45:04 (UTC)
Goto Top
Hallo face-smile

Nur so als kleiner Gedankenblitz:
Lies doch mit "dir /b /O:D > %temp%\dirlist.txt" den Inhalt des Backupverzeichnisses in eine Datei, das aktuellste Datum am Ende.
Dann ließ die letzten 3 Zeilen (= Backupname) in jeweils eine Variable ein und schieße diese Dateien dann vom Löschen aus.

Vielleicht hilft Dir der Denkanstoß weiter...

Gruß Dark
Member: user2009
user2009 Jan 12, 2010 at 13:13:57 (UTC)
Goto Top
Hallo Dark,

danke für Deine Antwort.
Für obige cmd habe ich ewig gebraucht.

Habe jetzt keinen Plan für Deinen Vorschlag:
Dann ließ die letzten 3 Zeilen (= Backupname) in jeweils eine Variable ein und schließe diese Dateien dann vom Löschen aus.

Wenn jemand diesen Threat liest und etwas ähnliches schon gemacht hat oder sonst helfen kann, dann bitte antworten.
Member: TheDarkLord
TheDarkLord Jan 12, 2010 at 13:52:49 (UTC)
Goto Top
Hallo face-smile

Ja kein Problem, ich hab gerade ein wenig Zeit, ich schau mir das mal an und poste Dir dann nen passenden Code-Schnipsel.

Bis bald!
Member: Biber
Biber Jan 12, 2010 at 14:15:51 (UTC)
Goto Top
Moin user2009,

mit dem Abfeuern der Zeile
FOR /F "skip=7 delims=" %i in ('Dir /ad /b /o-d d:\temp') do @echo rd "%i" /s /q  
...vom CMD-Pompt aus würden alle Verzeichnisse unterhalb von D:\temp ausgenommen die 7 jüngsten gelöscht (bzw das Löschen mit "ECHO rd" angezeigt).

Das sollte bei dir auch "aus dem Handgelenk" gehen, wenn du die Zeile einmailg verstanden hast.

Hint: Hilfe gibt es auch mit DIR/? und /FOR/? und /RD/?

Grüße
Biber
Member: TheDarkLord
TheDarkLord Jan 12, 2010 at 14:53:40 (UTC)
Goto Top
Du warst schneller face-smile

Er sagte, dass er nicht mit dem Datum arbeiten will, falls längere Zeit kein Backup gemacht wurde, aber das ist ja bei Dir kein Problem.
Du löscht ja nicht alles was älter ist als X sondern alles ausser die letzten X Backups.
Aber handelt es sich nicht um Backup-Dateien? Du schreibst was von UnterORDNERN ?!

Ich hab mal wieder viel zu kompliziert gedacht und alles sehr umständlich geschrieben, funktioniert aber auch face-wink
:: Das Script darf natürlich NICHT in dem Ordner liegen, wo die zu löschenden Backups sind, sonst wirds ja mit gelöscht :)

set "PFAD=Ordner-indem-die-zu-löschenden-backups-drin-sind"  

:: Schreibt den Ordnerinhalt in die temp. Datei, das neuste ganz oben
dir %PFAD% /b /O:-D > %temp%\dirlist.txt

:: Schreibt die erste Zeile in DATEI1
for /f "tokens=1,* delims=:" %%i in ('findstr /n  $ %temp%\dirlist.txt') do @(  
        for /L %%a in (1,1,1) do @if %%i==%%a @set DATEI1=%%j
)

:: Schreibt die zweite Zeile in DATEI2
for /f "tokens=1,* delims=:" %%i in ('findstr /n  $ %temp%\dirlist.txt') do @(  
        for /L %%a in (2,1,2) do @if %%i==%%a @set DATEI2=%%j
)

:: Schreibt die dritte Zeile in DATEI3
for /f "tokens=1,* delims=:" %%i in ('findstr /n  $ %temp%\dirlist.txt') do @(  
        for /L %%a in (3,1,3) do @if %%i==%%a @set DATEI3=%%j
)

:: Erstellt einen temp. backup-ordner
mkdir "%PFAD%\temp"  

:: Verschiebt die 3 letzten Backups in den temp Ordner
move "%PFAD%\%DATEI1%" %PFAD%\temp\  
move "%PFAD%\%DATEI2%" %PFAD%\temp\  
move "%PFAD%\%DATEI3%" %PFAD%\temp\  

:: Löscht alle Dateien im eingangs angegeben Ordner
echo j | del %PFAD%\*

:: Verschiebt die zu 3 letzten Backups zurück und entfernt den temp Ordner
cd %PFAD%
move backup\* ./
rd backup

Gruß Dark
Member: Biber
Biber Jan 12, 2010 at 15:15:30 (UTC)
Goto Top
Moin derDunkleLurch,

Zitat von @TheDarkLord:
Du warst schneller face-smile
Ja, aber....diese Anforderung hatten wir auch schon ein paar Male hier im Forum...
Aber handelt es sich nicht um Backup-Dateien? Du schreibst was von UnterORDNERN ?!
Doch, da hast du Recht. Ich hatte zu flüchtig gelesen. ...
Dann also statt DIR-Parameter /Ad genau umgekehrt (/a-d) und statt [RD Unterverzeichnis "%~i"] natürlich ein einfaches [del Datei "%~i"].

Grüße
Biber
Member: user2009
user2009 Jan 13, 2010 at 00:23:39 (UTC)
Goto Top
Hallo Biber,
vielen Dank es klappt super:
set "PFAD=d:\temp1"  

echo "Unterordner löschen"  
FOR /F "skip=3 delims=" %%i in ('Dir /ad /b /o-d %PFAD%') do (@echo rd "%PFAD%\%%i" /s /q)  
:: vom CMD-Pompt aus würden alle Verzeichnisse unterhalb von D:\temp ausgenommen die 3
:: jüngsten gelöscht (bzw das Löschen mit "ECHO rd" angezeigt).  
pause

echo.
echo "Backup-Dateien löschen"  
FOR /F "skip=3 delims=" %%i in ('Dir /a-d /b /o-d %PFAD%\') do (@echo del "%PFAD%\%%i" /s /q &&echo "%%i">>del.txt)  
:: neu:  dir /a-d  und del "%%i"  
pause

Gruß
user2009
Member: user2009
user2009 Jan 13, 2010 at 00:32:27 (UTC)
Goto Top
Hallo Dark,

vielen Dank für das Script es läuft 1A!

Gruß
user2009
Member: TheDarkLord
TheDarkLord Jan 13, 2010 at 09:43:52 (UTC)
Goto Top
Hallo face-smile

Danke für die Blumen xD

Hatte noch nen Fehler im Script, für den Fall, dass Du (oder jemand anderes) das umfangreichere von mir nehmen möchte, weil man da noch einiges zwischen basteln kann wie nen Log, welche Datei die aktuellste ist bzw. wann das letzte Backup lief etc:

:: Das Script darf natürlich NICHT in dem Ordner liegen, wo die zu löschenden Backups sind, sonst wirds ja mit gelöscht :)

set "PFAD=Ordner-indem-die-zu-löschenden-backups-drin-sind"  

:: Schreibt den Ordnerinhalt in die temp. Datei, das neuste ganz oben
dir %PFAD% /b /O:-D > %temp%\dirlist.txt

:: Schreibt die erste Zeile in DATEI1
for /f "tokens=1,* delims=:" %%i in ('findstr /n  $ %temp%\dirlist.txt') do @(  
        for /L %%a in (1,1,1) do @if %%i==%%a @set DATEI1=%%j
)

:: Schreibt die zweite Zeile in DATEI2
for /f "tokens=1,* delims=:" %%i in ('findstr /n  $ %temp%\dirlist.txt') do @(  
        for /L %%a in (2,1,2) do @if %%i==%%a @set DATEI2=%%j
)

:: Schreibt die dritte Zeile in DATEI3
for /f "tokens=1,* delims=:" %%i in ('findstr /n  $ %temp%\dirlist.txt') do @(  
        for /L %%a in (3,1,3) do @if %%i==%%a @set DATEI3=%%j
)

:: Erstellt einen temp. backup-ordner
mkdir "%PFAD%\temp"  

:: Verschiebt die 3 letzten Backups in den temp Ordner
move "%PFAD%\%DATEI1%" %PFAD%\temp\  
move "%PFAD%\%DATEI2%" %PFAD%\temp\  
move "%PFAD%\%DATEI3%" %PFAD%\temp\  

:: Löscht alle Dateien im eingangs angegeben Ordner
echo j | del %PFAD%\*

:: Verschiebt die 3 letzten Backups zurück und entfernt den temp Ordner
cd %PFAD%
move temp\* ./
rd temp
del %temp%\dirlist.txt 

Gruß Dark
Member: user2009
user2009 Jan 13, 2010 at 11:04:27 (UTC)
Goto Top
Hallo Dark,

del %temp%\dirlist.txt
o.k.

Ja für Logs, die man sich selbst zusammen baut, ist das Script gut geeignet.

Um jedoch Unterordner auszusortieren und zu verschieben sollte nicht %PFAD%\temp, sondern ein %neuerPFAD% verwendet werden und statt mit "move" lieber mit "robocopy.exe .... /move" gearbeitet werden.

(Zur automatischen Unterscheidung, ob es sich um Dateien oder Verzeichnisse handelt gibt es diesen "forfiles"-Code:
:: console 
FOR /F "delims=" %i in ('forfiles /s /c "CMD /C if @ISDIR==TRUE echo @FILE ist ein Verzeichnis"') do (pause && goto robocopy)  
)

Also Danke noch mal und Gruß
User2009