Seite 1 von 1

Verfasst: Sonntag 8. Juli 2007, 17:31
von HWK
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