strgaltentf
Goto Top

Verzeichnisse für Datensicherung aufteilen

für Sicherung auf DVD

bei uns werden regelmäßig kleinere aber auch größere Sicherungen von Userdaten auf DVD gemacht. Dabei wird das von den Usern vorgegebene Verzeichnis komplett auf DVD gebrannt.
Wenn die Verzeichnisse aber größer sind als eine DVD müssen wir jedesmal die Daten aufteilen.

Ich suche ein Programm welches mir automatisch ein vorgegebenes Verzeichnis in 4,5Gb oder 700MB große unterteilt.
Wichtig ist das die Daten nicht als Backupdatei sondern als Verzeichnisse gesichert werden damit die User ohne Zusatzsotware wieder auf die Daten zugreifen können.

Content-ID: 48424

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

Ausgedruckt am: 23.11.2024 um 04:11 Uhr

bastla
bastla 12.01.2007 um 00:20:10 Uhr
Goto Top
Hallo StrgAltEntf!

Quasi als Abfallprodukt einer anderen Anforderung hier im Forum könnte ich folgende Bastel-Lösung als Batch anbieten:
@echo off & setlocal
set SourceDir="%1"  
if %SourceDir% neq "" goto :DoIt  
echo Bitte beim Aufruf den zu sichernden Ordner angeben!
echo Beispiel: %~nx0 "D:\Alle meine Daten"  
pause > nul
goto :eof
:DoIt
set TempDir=D:\Backup
set Pattern=*.*
set LogOK=D:\BackupOK.txt
set LogError=D:\BackupError.txt
::Kapazitätsgrenze in Bytes
set Max=700000000
::Alte Logdateien löschen
if exist "%LogOK%" del "%LogOK%"  
if exist "%LogError%" del "%LogError%"  
::Temp-Ordner leer anlegen
if exist "%TempDir%" rd /s /q "%TempDir%"  
md "%TempDir%"  
::Quelldateien in Temp-Verzeichnis kopieren
copy %SourceDir%\%Pattern% %TempDir%
::Zur einfacheren Verarbeitung in Temp-Verzeichnis wechseln
pushd %TempDir%
::Mit Unterverzeichnis Nr 1 beginnen
set /a Teil=1
::Summe der (bisher enthaltenen) Dateigrößen auf 0 setzen
set /a Bytes=0
::Unterverzeichnis 1 erstellen
md %Teil%
echo Erstelle Verzeichnis %Teil%
::Alle Dateien des Temp-Verzeichnisses eínzeln aufrufen und überprüfen
for %%f in ("*.*") do call :Check "%%f"  
::Statistik für die fertigen Unterverzeichnisse
echo ===================================== >> %LogOK%
for /f %%f in ('dir /b /ad') do for /f "tokens=3" %%s in ('dir %%f /c ^| findstr /C:"Datei(en)"') do echo Verzeichnis %%f - %%s Bytes >> %LogOK%  
::Falls Dateien im Temp-Verzeichnis verblieben sind, diese mit Dateigröße im ErrorLog anführen
if not exist *.* goto :eof
echo Nicht aufgeteilt: >> %LogError%
for /f %%f in ('dir /b /a-d') do echo %%~zf;%%f >> %LogError%  
popd
::Fertig.
goto :eof
:Check
::Neue Gesamtdateigröße des aktuellen Unterverzeichnisses ermitteln
set /a Bytes=%Bytes%+%~z1
::Wenn Max-Kapazität noch nicht überschritten:
::  Datei in aktuelles Unterverzeichnis verschieben
if %Bytes% leq %Max% goto :MoveIt
::Wenn Datei > Max-Kapazität:
::  Gesamtdateigröße auf alten Stand korrigieren und Datei im Temp-Verzeichnis belassen
if %~z1 gtr %Max% (set /a Bytes=%Bytes%-%~z1) & goto :eof
::Neues Unterverzeichnis erstellen
set /a Teil+=1
md %Teil%
echo Erstelle Verzeichnis %Teil%
set /a Bytes=%~z1
:MoveIt
::Datei in aktuelles Unterverzeichnis verschieben und Log schreiben
move %1 %Teil% > nul && echo %Teil%;%~1 >> "%LogOK%" || echo %~1: Fehler beim Verschieben nach %Teil% >> "%LogError%"  
goto :eof
Vorweg die Einschränkungen: Es wird immer nur ein Verzeichnis (nicht dessen Unterverzeichnisse) bearbeitet und es erfolgt keinerlei Optimierung (hinsichtlich Ausnutzung der CD/DVD-Kapazität).

Zum Ablauf:
Dem Batch ist das Quellverzeichnis als Argument zu übergeben (auch per Drag & Drop möglich), oder Du änderst die Zeile set SourceDir="%1" auf die Angabe eines konkreten Pfades, also zB set SourceDir="D:\Alle meine Daten". Weitere Pfad- / Dateiangaben für das Temporäre Verzeichnis (in dem zuerst die einzelnen Dateien und danach die Unterverzeichnisse für die Aufteilung abgelegt werden) und die Log-Dateien musst Du an Deine Gegebenheiten anpassen, ebenso die Kapazitätsgrenze "Max". (Anmerkung zum vorgeschlagenen Wert: Bei Umrechnung der nominellen Kapazität einer CD mit 700 MB ergeben sich 700 * 1024 * 1024 = 734.003.200 Bytes, daher sind bei Max=700000000 Reserven für das CD-Dateisystem vorhanden. Werden viele sehr kleine Dateien gesichert, müsste man den Max-Wert eventuell noch niedriger ansetzen.)

Zunächst werden die Dateien aus dem Quellverzeichnis in das Temp-Verzeichnis kopiert und dort dann einzeln auf ihre Größe überprüft und in aufsteigend nummerierte Unterverzeichnisse verschoben. Passt (hinsichtlich der Kapazitätsgrenze "Max") die Datei noch in das aktuelle Unterverzeichnis, wird sie verschoben und mit Unterordner-Nr und Dateiname in das OK-Log eingetragen (sollte beim Verschiebevorgang ein Fehler auftreten, wird dies im Error-Log vermerkt). Ist die Datei größer als der "Max"-Wert (und würde daher ohnehin nicht auf eine CD passen), bleibt sie im Temp-Ordner (alle verbliebenen Dateien werden am Ende der Verarbeitung ins Error-Log geschrieben). Ist die Datei nur für das aktuelle Unterverzeichnis zu groß, wird ein Neues angelegt und die Datei in dieses verschoben.

Am Ende der Verarbeitung werden die Logs ergänzt: Für alle erstellten Unterverzeichnisse wird die Gesamtgröße der enthaltenen Dateien ermittelt und im OK-Log vermerkt, zu große Dateien (siehe oben) werden in das Error-Log eingetragen.

Um während des Vorganges dem Benutzer ein wenig Feedback zu geben, lasse ich beim "copy"-Befehl die einzelnen Dateien (wenn nicht gewünscht, > nul anfügen) und jeweils beim Erstellen eines Unterverzeichnisses eine kurze Information anzeigen.

Falls Dir dieses Script ein wenig die Arbeit erleichtert, würde mich das freuen.

Grüße
bastla
StrgAltEntf
StrgAltEntf 12.01.2007 um 00:24:54 Uhr
Goto Top
leider hilft mir das nicht weiter....
Es werden teilweise Pfadtiefen von 20 Ebenen erreicht und die Dateigrößen schwanken zwischen 1Kb und 2GB bei einer Anzahl von meist mehreren tausend Dateien

trotzdem Danke
Biber
Biber 12.01.2007 um 00:35:02 Uhr
Goto Top
Na ja...

wir haben hier (Forumssuche) auch ein paar native Batch-Beispiele zur Ermittlung einer DirSize eines Unterverzeichnes incl. der Unterordner.

Das ließe sich sicherlich noch vorschalten vor das eigentliche XCopy.

Andererseits... zwei Nachfragen halten mich davon ab, hier weiterzuskripten:

- es wäre dann wahrscheinlich sinnvoller, den Krempel in VBS (oder besser) abzufackeln aus Performance-Gründen
- und, viel wichtiger: seid ihr sicher, dass ihr Eure Prozesse sinnvoll definiert bzw in den letzten Jahren überprüft habt?

Wenn es zu einer derartigen Anforderung kommen kann, ist IMHO irgendetwas aus dem Ruder gelaufen.

So ein Gesamtdatenklumpen von (siehe oben), den alle User benötigen... hmmmm.
Kann ich kaum glauben. Wie ist es dazu gekommen?

Grüße
Biber
[Edit] @bastla
Biber weiß das sicher auf 2 Kommastellen genau
Jein in diesem Fall.
Die handlebare Pfadlänge schwankt schon bei unterschiedlichen M$-Utilitities (zum Kopieren, Moven, Rechte setzen) zwischen 251 und 256 Zeichen.
Wenn das Ganze noch auf CDFS-Struktur gepresst werden soll, sind es ohnehin max. 250, wenn Du auf der sicheren Seite sein willst.
Wenn aus Versehen noch Umlaute in Datei- oder Verzeichnisnamen sind, darfst Du nochmal ein paar Zeichen abziehen.
Bleiben als (meine empfohlene) Kompatibilitäts-Schmerzgrenze ca 220. Zeichen als unkritische Länge.
Die Anzahl der Verzeichnisebenen spielt nur eine untergeordnete Rolle - an die Grenze kannst Du nicht stossen... weil vorher alles wegen der Pfadlänge crasht... face-wink
[/Edit]
bastla
bastla 12.01.2007 um 00:37:41 Uhr
Goto Top
Hallo StrgAltEntf!

Es werden teilweise Pfadtiefen von 20 Ebenen erreicht und die Dateigrößen schwanken zwischen 1Kb und 2GB bei einer Anzahl von meist mehreren tausend Dateien
Ich hätte das Script sowieso geschrieben (sportlicher Ehrgeiz), auch wenn Du diese Information schon etwas früher angebracht hättest face-wink

Ganz nebenbei: Lassen sich 20 Verzeichnisebenen eigentlich noch vernünftig handeln? Im Hinterkopf habe ich auch noch eine Beschränkung der Pfadlänge (auf unter 256 Zeichen - Biber weiß das sicher auf 2 Kommastellen genau face-wink) unter DOS/Batch

Grüße
bastla

[Edit] @Biber - Ah, schon da ... [/Edit]
StrgAltEntf
StrgAltEntf 12.01.2007 um 08:59:58 Uhr
Goto Top
Die Daten werden nicht von allen Usern gebraucht sondern nur von bestimmten Projektgruppen. Es geht hier um die Entwicklung von Auto-Multimediageräten. Die Sicherung ist für ältere Daten gedacht die auf den Servern "rumgammeln". Beim händischen kopieren auf unseren "Brennrechner" bin ich auch schon öfter an die Pfadgrenze gestoßen....
miniversum
miniversum 13.01.2007 um 18:37:44 Uhr
Goto Top
Also wenn das ganze noch mit den entsprechenden unterverzeichnissen geht könnt ich das ganze Ding auch noch gebrauchen (Zwar ncith dringen aber als Spielerei).

Das die Verzeihnissstruktur wo anders erstellt wird bekomme ich sogar auch noch hin, aber das ganze zusammenzubauen zu einem da bleib ich irgentwo hängen.

miniversum