Datei-Backup optimieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

So, das ist jetzt mein weitgehend fertiges Backup-Programm. Zum Brennen habe ich letztendlich Nero verwendet. Dies liegt ja vielen Brennern bei und kann mit nerocmd über die Kommandozeile gesteuert werden.

Code: Alles auswählen

#!/usr/local/bin/python
# -*- coding: cp1252 -*-
# File: Backup.py

'''Script zum optimierten Backup auf mehrere Medien.'''

import os


DIRFILE = 'Dirs.txt'
MAXSIZE = 4700000000
NEROCMD = 'c:\\programme\\nero\\"nero 7"\\Core\\nerocmd.exe --write '\
          '--drivename d --real --speed 04 --iso Backup.%03i --dvd '\
          '--detect_non_empty_disc --enable_abort --underrun_prot '\
          '--create_iso_fs --recursive --disable_eject --verify "%s"'
          #' --force_erase_disc'


def dirsize(name):
    '''Größe eines Verzeichnisses bestimmen.'''
    if not os.path.exists(name):
        return -1
    if os.path.isfile(name):
        return os.path.getsize(name)
    size = 0
    for path, dirs, files in os.walk(name):
        for dir_ in dirs:
            size += os.path.getsize(os.path.join(path, dir_))
        for file_ in files:
            size += os.path.getsize(os.path.join(path, file_))
    return size


def make_dir_list():
    '''Liste der Verzeichnisse und deren Größe erstellen.'''
    dir_list = []
    try:
        infile = file(DIRFILE, 'r')
        try:
            for name in infile:
                name = name.strip()
                if name.endswith(' S'):
                    name = name[:-2]
                    if os.path.isdir(name):
                        for name_ in os.listdir(name):
                            name_ = os.path.join(name, name_)
                            size = dirsize(name_)
                            if size >= 0:
                                dir_list.append((size, name_))
                        continue
                size = dirsize(name)
                if size >= 0:
                    dir_list.append((size, name))
        finally:
            infile.close()
    except IOError, error:
        print 'Kann Datei "%s" nicht lesen!' % DIRFILE
    return dir_list


def divide(dir_list):
    '''Verzeichnisse auf mehrere Medien verteilen.'''
    dir_list.sort(reverse=True)
    dest_list = []
    to_large = []
    for source_size, source_filename in dir_list:
        if source_size > MAXSIZE:
            to_large.append(source_filename)
            continue
        for dest_size, dest_items in dest_list:
            if (dest_size[0] + source_size) <= MAXSIZE:
                dest_size[0] += source_size
                dest_items.append(source_filename)
                break
        else:
            dest_list.append([[source_size], [source_filename]])
    return dest_list, to_large


def main():
    dir_list = make_dir_list()
    if not dir_list:
        return
    cont, to_large = divide(dir_list)
    if to_large:
        print 'Zu groß für ein Medium sind:\n%s' % (', '.join(to_large))
    for i, (size, cont_) in enumerate(cont):
        print 'Schreibe Medium Nr. %i' % (i + 1)
        os.system(NEROCMD % (i + 1, '" "'.join(cont_)))


if __name__ == '__main__':
    main()
Die zu sichernden Dateien bzw. Ordner befinden sich in einer Datei names Dirs.txt. Der Parameter 'S' am Ende führt dazu, dass die darin enthaltenen Ordner/Dateien einzeln erfasst werden. Das kürzt die Eingabe ab. dirsize berechnet die Größe eines Verzeichnisses. divide entspricht weitgehend Gerolds Script.
MfG
HWK
Antworten