jknapp
Goto Top

Inkrementelles Backup ohne Archivbit und Änderungsdatum (Robocopy?)

Hallo Zusammen,

vielleicht mal wieder ein unlösbares Thema:
Kann man entwerder:
-Robocopy dazu bewegen, wenn es eine Datei kopiert das Zugriffsdatum "hochzusetzen"
oder
-Robocopy dazu bewegen, dass Erstellungsdatum zu setzen beim kopieren UND
bei /maxage das jüngere aus Erstellung und Änderung zu werten? (in manchen Dokus steht das so, klappt aber bei mir nicht (Windows 8.1)


Hintergrund:
Ich möchte ein einfaches inkrementelles Backup("Archiv Dateiversionierung"), aber
-das Archivbit kann nicht benutzt werden (Weil es parallel ein "großes Backup"gibt, dem ich nicht in die Quere kommen darf
-Das Änderungsdatum auch alleine auch nicht wirklich taugt, da ich nicht weiß, wann die "Offline-Kollegen" das letzte mal "synchronisiert" haben (ebenfalls per Robocopy) und daher eine beispielsweise am 15.09. geänderte Datei vielleicht erst 8 Tage später synchronisiert wird und daher erst nicht für das Backup zur Verfügung steht und dann schon älter ist als das vorgegebene /Maxage von 2 oder 3 Tagen.


Alternativ wäre auch sowas wie ein Datenbankbasiertes Backup möglich (verschiedene intelligentere Sync-Tool machen das ja im Pinzip, aber eben immer nur mit einem Zielordner, wo dann die neuen Dateien die alten überschreiben, was aber eben genau nicht gewünscht ist).

Danke für eure Tipps!

Gruß
Jochen

Content-Key: 220703

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

Printed on: April 19, 2024 at 12:04 o'clock

Member: Joe2011
Joe2011 Oct 29, 2013 at 09:50:45 (UTC)
Goto Top
Moin Jochen,

für solche Fälle benutze ich "VersionBackup". Das sichert nur veränderte Dateien; jede Version wird aufbewahrt bis ich irgendwann wieder ein Vollbackup erstelle. So kann ich auch ältere Versionen ohne Probleme wieder herstellen. Die Versionsstände werden in einer DB gesichert; die Dateien in einem ZIP-Filesystem.

Gruß

Joe
Member: jknapp
jknapp Oct 29, 2013 at 10:11:31 (UTC)
Goto Top
Hallo Joe,

danke erstmal.
Sieht eigentlich nicht schlecht aus, aber zwei große Kontras:

-Die Entwicklung wird eingestellt, trotzdem wird das Produkt noch verkauft. Geld ausgeben, für eine Software ohne Support/Weiterentwicklung von einem kommerziellen Unternehmen? Da bin ich ja mit Open Source (jetzt mal Grundsätzlich) deutlich besser bedient. Da weiß ich wenigstens, dass ich im Zweifel alleine dasteht.

-Ich konnte jetzt auf Anhieb nicht erkennen, dass die Dateien als solche auf Basis einer DB als zu sichern erkannt werden. Also doch wieder Änderungsdatum oder Archivbit? (Womit mein Problem nicht gelöst wäre?)

Im Grund wäre ein Backup-Tool, dass auf Datenbankbasis neues/Änderungen erkennt so oder so genial,
aber das scheint es nicht zu geben? Ich hatte sogar schon überlegt sowas selbst in Python zu scripten,
kostet aber halt wieder viel Zeit und ich weiß nicht, ob ich mich traue, dass dann produktiv einzusetzen.


Gruß
Jochen
Member: jknapp
jknapp Oct 31, 2013 updated at 09:30:46 (UTC)
Goto Top
Ok noch für die Nachwelt:
Da es wohl keine Lösungen gibt, die meinen Vorstellungen entspricht habe ich mich nun doch entschlossen, das ganze auf Basis von Python(3) zu lösen. Folgendes hilfreiche Script fand ich unter:
http://dbudwm.wordpress.com/2012/08/21/verzeichnisse-vergleichen-mit-py ...
Verglichen wird auf Basis der MD5 Hashes, clevere Lösung, die ich noch etwas ausgebaut habe.

Wenns fertig ist werde ich die Endlösung nochmal posten.
Erweitern will ich folgendes:

-Damit das Quellverzeichnis des Vergleichs nicht irgendwo (Als Backup) vorgehalten werden muss, wird das Originalverzeichnis am ENDE des Scripts neu eingelesen und in eine JSON-Datei "gespeichert". Diese dient beim nächsten ausführen als Referenzwert, so dass das Verzeichnis jeweils mit sich selbst verglichen wird und differenten ausgegeben werden.

-Diese Differenzen werden dann nicht nur in eine Textdatei gespeichert ("Log") sondern dienen auch als Pfad/Ziel Angabe für einen "XCopy"-Befehl.

Aber jetzt erstmal der Ursprungscode (Python2):
import hashlib
import os
import sys
 
def md5checksum(filePath):
    with open(filePath, 'rb') as fi:  
        h = hashlib.md5()
        while True:
            data = fi.read(1024)
            if not data:
                break
            h.update(data)
    return h.hexdigest()
         
def scandir(dir):
    print "Scanning %s" % (dir,)  
    fdata = {}
    for root, dirs, files in os.walk(dir):
        for name in files:
            fullpath = os.path.join(root, name)
            path = fullpath[len(dir):]
            fdata[path] = md5checksum(fullpath)
    print "Found: %i Files" % (len(fdata),)  
    return fdata
 
 
def main(firstpath, secondpath):
    """ Give me two directories to compare """  
    first_data = scandir(firstpath)
    second_data = scandir(secondpath)
    for file, md5 in first_data.items():
        if file not in second_data:
            print "%s only in %s" % (file, firstpath,)  
        else:
            if second_data[file] == md5:
                del second_data[file]
            else:
                print "%s not the same" % (file,)  
                del second_data[file]
    for file, md5 in second_data.items():
        if file not in (first_data):
            print "%s only in %s" % (file, secondpath,)  
        else:
            print "%s <-- You see this? Something gone WROOOOOONG!" % (file,)  
 
if __name__ == "__main__":  
    main(sys.argv[1], sys.argv[2])