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