[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: OT: Optimalen Inhalt einer CDR bestimmen



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


Reply to: