Claus Malter: > > Und zwar habe ich hier auf unserem File Server Verzeichnisse sortiert > nach Thematik. In diesen Verzeichnissen liegen mehr oder weniger große > PowerPoint Präsentationen unserer Abteilung. Diese Verzeichnisse sollen > jetzt optimal auf CD gebrannt werden (es macht keinen Unterschied ob DVD > oder CD, weil es etliche Gigabytes sind. Im Datei Server ist derzeit > nur ein CD-R Laufwerk.). Für ein ähnliches Problem habe ich auch mal was selbst in Python geschrieben (hängt an). Allerdings geht dieses Skript recht stupide vor: es geht rekursiv eine Verzeichnisstruktur durch und guckt jeweils, ob das nächste Verzeichnis noch passt. Wenn nicht, wird sozusagen ein "neues Volume" aufgemacht. Am Ende hat man dann ein par durchnumerierte Dateien im aktuellen Verzeichnis rumliegen, in denen die Verzeichnisnamen stehen. Aktuell ist auch die Größe eines Datenträgers hartkodiert, das kann man aber ohne großartige Kenntnisse leicht selbst ändern. J. -- No-one appears to be able to help me. [Agree] [Disagree] <http://www.slowlydownward.com/NODATA/data_enter2.html>
#!/usr/bin/python2.4 import sys, os from os.path import join, getsize, dirname from optparse import OptionParser source_dir = sys.argv[1] # according to 'man 1 growisofs', DVDs contain up to 4482 MB max_chunk_size = 4482 * 1024 * 1024 #max_chunk_size = 50 def subdir_sizes(topdir, include_empty_dirs=False): tree = os.walk(topdir) for dirpath, dirnames, filenames in tree: if filenames and not include_empty_dirs: files = (join(dirpath, name) for name in filenames) sizes = (getsize(filename) for filename in files) yield dirpath, sum(sizes, 0) class Chunk(list): def __init__(self, size=0): self.size = size def __str__(self): #return "<Chunk: %s dirs, %s Bytes>" % (len(self), self.size) return "\n".join(path for path in self) def main(): cur_chunk = Chunk() chunks = [] for dirpath, dir_size in subdir_sizes(source_dir): if dir_size > max_chunk_size: sys.stderr.write("skipping... %s -- too large for single medium!\n" % dirpath) continue if dir_size + cur_chunk.size >= max_chunk_size: # next dir doesn't fit into chunk chunks.append(cur_chunk) #print "chunk no. %03d: %s" % (len(chunks), cur_chunk) cur_chunk = Chunk() cur_chunk.append(dirpath) cur_chunk.size += dir_size else: chunks.append(cur_chunk) #print "chunk no. %03d: %s" % (len(chunks), cur_chunk) for i in range(0, len(chunks)): f = file('chunk-%03d' % i, 'w') f.write("\n".join("%s=%s" % (path,path) for path in chunks[i])) #print("\n".join("%s=%s" % (path,path) for path in chunks[i])) f.close() if __name__ == '__main__': main() # vim: set et ts=4
Attachment:
signature.asc
Description: Digital signature