Programm, das eine Gruppe von Dateien in große Stücke komprimiert, die einzeln geöffnet werden können

Ich suche nach einem Windows-Programm, das eine große Gruppe von Dateien komprimieren und in mehreren Zip-Dateien speichern kann, die jeweils (sagen wir) nicht mehr als 100 MB groß sind.

Es ist jedoch wichtig, dass jede einzelne Zip-Datei einzeln geöffnet werden kann, dass Sie die anderen Zip-Dateien nicht benötigen, um eine bestimmte zu öffnen.

Dies soll mich davor bewahren, manuell zu versuchen, Dateien im Wert von 100 MB (oder etwas weniger) auszuwählen, sie zu komprimieren und zu wiederholen.

Auch hier funktioniert die normale Art und Weise, wie Programme wie WinZip damit umgehen, NICHT für mich, da ich glaube, dass es einen Satz wie fileset.zip, fileset.z01, fileset.z02 usw. erstellt, und ich verstehe, dass Sie eine Datei wie nicht öffnen können fileset.z02 allein, ohne alle anderen im Set zu haben. Komprimierung ist NICHT erforderlich, ich versuche nur, sie zu packen, nicht unbedingt zu komprimieren. Komprimierung wäre großartig, aber der wahre Zweck besteht darin, die Dateien in überschaubaren Blöcken zu sammeln.

Erfüllen irgendwelche Zip-Dienstprogramme das, was ich brauche?

Nur ein Vorschlag, da ich es nicht so genau weiß, aber haben Sie 7ZipCommandLine ausprobiert, um dies zu versuchen?

Antworten (3)

Interessantes Problem! Ich kenne keine Software, um das zu erreichen, was Sie wollen, aber wie wäre es mit so etwas?

#!/usr/bin/env python

import os, operator, sys
limit = int(sys.argv[1])
dirpath = os.path.abspath(sys.argv[2])
# make a generator for all file paths within dirpath
all_files = ( (os.path.join(basedir, filename) for basedir, dirs, files in os.walk(dirpath) for filename in files))
all_file_sizes = ((os.path.getsize(fname), fname) for fname in all_files)
sorted_files = sorted(all_file_sizes) 


def yield_groups(size_filenames, limit):
    cumulative_size = 0
    file_list = []
    for file_size, file_name in size_filenames:
        new_size = cumulative_size + file_size
        #print "%r" % new_size, "%r" %limit,  new_size > limit, file_name
        if new_size > limit:
            #print "bigger"
            yield file_list
            file_list = [file_name]
            cumulative_size = file_size
        else:
            file_list.append(file_name)
            cumulative_size += file_size

    yield file_list


for i, group in enumerate(yield_groups(sorted_files, limit)):
    print ("tar -cvf /tmp/group-%03u.tar %s" % (i, ' '.join(group)))

Bei mir scheint es ganz gut zu funktionieren:

➜ chunks>du -hs *
1,0M    file1
1,0M    file2
1,0M    file3
1,0M    file4
1,0M    file5
2,0M    file6
2,0M    file7
3,0M    file8
3,0M    file9

Jetzt Gruppen von 3 MB anfordern:

➜ chunks>python /tmp/sizezip.py 3145728 /tmp//chunks/
tar -cvf /tmp/group-000.tar /tmp/chunks/file1 /tmp/chunks/file2 /tmp/chunks/file3
tar -cvf /tmp/group-001.tar /tmp/chunks/file4 /tmp/chunks/file5
tar -cvf /tmp/group-002.tar /tmp/chunks/file6
tar -cvf /tmp/group-003.tar /tmp/chunks/file7
tar -cvf /tmp/group-004.tar /tmp/chunks/file8
tar -cvf /tmp/group-005.tar /tmp/chunks/file9

Oder besser gesagt 5MB:

➜ chunks>python /tmp/sizezip.py 5242880  /tmp//chunks/
tar -cvf /tmp/group-000.tar /tmp/chunks/file1 /tmp/chunks/file2 /tmp/chunks/file3 /tmp/chunks/file4 /tmp/chunks/file5
tar -cvf /tmp/group-001.tar /tmp/chunks/file6 /tmp/chunks/file7
tar -cvf /tmp/group-002.tar /tmp/chunks/file8
tar -cvf /tmp/group-003.tar /tmp/chunks/file9

Beachten Sie, dass dies ein Quick-and-Dirty-Code ist. Es wird nicht einmal versucht, das Rucksackproblem zu lösen .

Leider ist dort, wo dies hinführt, kein Python enthalten oder kann hinzugefügt werden, sondern nur Windows-Programme. Ich finde es jedoch toll, dass Sie dies programmiert haben, da ich derzeit versuche, Python (mit einem Freund) selbst zu lernen, und versuchen werde, so viel wie möglich aus Ihrem Code zu lernen! Vielen Dank.
Sie können immer eine tragbare Python verwenden, wie z. B. python-xy von einem USB-Laufwerk, um so etwas wie oben zu verwenden. Beachten Sie auch, dass die Chunks das Zip-Format anstelle von tar verwenden könnten und dass die Komprimierung aktiviert werden könnte.
Außerdem können Sie Python-Skripte in ausführbare Windows-Programme umwandeln, die ohne Python-Installation ausgeführt werden können, z. B. mit py2exe.

Eine weitere Option, mit oder ohne Komprimierung, ist die folgende:

  • Kopieren Sie den gesamten Baum, den Sie packen möchten
  • Implementieren Sie eine Schleife, die den gesamten Kopierbaum durchläuft und dabei Folgendes tut:

    • Wenn die aktuell hinzuzufügende Datei über der Dateigrößenbeschränkung liegt, tun Sie etwas ... Kennzeichnen, beenden, Ausnahme auslösen, ...
    • Datei (mit oder ohne Komprimierung) zu einem temporären Archiv hinzufügen
    • Wenn das temporäre Archiv die Dateigrößenbeschränkung nicht überschreitet, entfernen Sie die aktuell hinzugefügte Datei
    • Wenn die Größe der temporären Archivdatei über dem Limit liegt, verschieben Sie sie aus dem Weg und starten Sie ein neues temporäres Archiv (dadurch wird die zuletzt hinzugefügte Datei nicht gelöscht).
  • Machen Sie mit Ihren neu erstellten Chunk-Archiven, was Sie wollen

  • (optional) Erstellen Sie eine Liste basierend auf jedem Chunk-Archiv, um eine Liste darüber zu führen, welche Dateien in welches Archiv gelangt sind

Dieses Verfahren hat einige Vorteile:

  1. Da Sie an einer Kopie des ursprünglichen Baums arbeiten, können Sie bereits archivierte/verarbeitete Dateien löschen
  2. Es kann mit ziemlich einfachen Tools (z. B. Windows-Befehls-/Batch-Dateien) implementiert werden, ohne Zugriff auf Wörterbücher (oder ähnliche Tools, um zu verfolgen, welche Dateien noch bearbeitet werden müssen) zu haben.
  3. Bei Bedarf/Wunsch können Sie zusätzliche Tools ausführen, um vor dem Archivierungsprozess unnötige Dateien aus dem Kopierbaum zu entfernen, dh zu große Dateien entfernen, Backup-Versionen entfernen, andere uninteressante Dateien entfernen, ...

Das Verfahren (oder jedes von Ihnen gewählte Tool) kann jedoch fehlschlagen, wenn Sie einzelne Dateien haben, die über Ihrer Dateigrößenbeschränkung liegen. Aber wenn sie aus dem Weg geräumt werden, können Sie diese anschließend in einem manuellen Prozess bearbeiten.

PS! Dies ähnelt dem Python-Ansatz, aber Sie benötigen kein Python, und es kann entweder automatisiert oder eigentlich auch manuell ohne allzu großen Aufwand verwendet werden. Ich habe einen ähnlichen Durchlauf mit ein paar tausend Dateien durchgeführt, bei dem wir einige Zwischendateien und so weiter entfernt haben, und die Arbeit mit einer Kopie der Originaldaten hat alles viel einfacher gemacht
PPS! Eine Kopie der Daten erfordert jedoch, dass Sie Platz haben, um Ihre Daten vorübergehend zu duplizieren

Ich habe die gleiche Anforderung und habe recherchiert und spinzip.exe gefunden. Das Problem ist jedoch, dass die Ordnerstruktur in der ZIP-Datei beibehalten wird, was für meine Anforderungen nicht gut ist. Der Autor sagte, sie wüssten nicht, wie sie das Problem beheben könnten. http://www.donationcoder.com/forum/index.php?board=298.0

Deine Frage ist über ein Jahr alt. Wenn Sie also eine Lösung gefunden haben, posten Sie sie bitte hier als Kommentar, damit ich eine E-Mail-Benachrichtigung erhalten kann. Vielen Dank

An diesem Punkt kann ich mich nicht einmal erinnern, wofür das war, aber ich scheine zu glauben, dass ich einen Weg gefunden habe, das Hauptproblem zu umgehen, was auch immer das war. Tut mir leid, dass ich nichts mehr für dich habe, das war vor vielen, vielen technischen Rätseln.