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