Ändern Sie die .zip-Verzeichnisstruktur mithilfe der 7zip-Befehlszeile (vorzugsweise), ohne sie zu dekomprimieren

0

Gegeben eine .zip mit der folgenden Beispielstruktur:

/folder1/
  file1.1.txt
  file1.2.txt
/folder2/
  file2.1.txt
  file2.2.txt
file1.txt
file2.txt

Ich muss in der Lage sein, diese interne Dateistruktur mit dem 7zip-Kommandozeilen-Tool wie folgt zu ändern:

1. Ich muss alle vorhandenen Dateien in einen neuen Ordner innerhalb des Archivs verschieben (z. B. die gespeicherten Pfade mit "/ myfolder" voranstellen)

  1. Ich muss einen weiteren Ordner mit anderen Dateien hinzufügen (außerhalb dieser Frage gelöst)

Ohne Entpacken hätte ich daher gerne die folgende Struktur:

/myfolder/
  myfolderfile1.txt
  myfolderfile2.txt
/data/
  /folder1/
    file1.1.txt
    file1.2.txt
  /folder2/
    file2.1.txt
    file2.2.txt
  file1.txt
  file2.txt

Ich weiß, wie man Punkt 2 löst, aber Punkt 1 (Änderung der internen Struktur) bereitet mir Probleme.

Der Grund für diese Anforderung ist, dass ich mit SEHR großen und komplexen Archiven arbeite, mit dem einzigen Zweck, die Dateien neu anzuordnen und einige weitere auf die gleiche Weise hinzuzufügen. Es scheint kontraproduktiv, für jede Datei (die bis zu einer Stunde dauern kann) zu entpacken, wenn ich dies einfacher machen könnte.

Auch wenn es ein anderes Tool gibt, das diese Aufgabe besser ausführen kann (d. H. NICHT 7zip, sondern ein anderes) kostenloses Kommandozeilen-Tool ), Ich bin offen für Vorschläge.

Dankesehr!

P.S. Mir ist bekannt, dass beim Erhöhen des Verzeichnispfads in der Nähe von 248 Zeichen möglicherweise ein Problem mit der Pfadlänge auftritt. Dies ist jedoch akzeptabel.

Florin Mircea
quelle
1
Ich denke nicht, dass Werkzeuge diese Fähigkeit haben werden. Möglicherweise können Sie mit einem der 7zip-API-Wrapper selbst etwas schreiben ...
DavidPostill

Antworten:

1

Du kannst den ... benutzen 7z rn Befehl zum Verschieben von Dateien und Ordnern in Archiven. Leider kann das Stammverzeichnis nicht verschoben werden. Sie können jedoch ein Skript verwenden, um die Ausgabe von zu analysieren 7z l und TU es.

Hier ist ein kurzes Beispiel in Python: ( 7z muss in PATH vorhanden sein)

import os;
import subprocess;
import sys;

if len(sys.argv) < 3:
    print("Syntax: " + sys.argv[0] + " <archive> <subfolder>")
    sys.exit(1)

skip = True
renamed = []

proc = subprocess.Popen(["7z", "l", sys.argv[1]], stdout=subprocess.PIPE, universal_newlines=True)
for line in iter(proc.stdout.readline, ''):
    line_file = line.rstrip().split(" ")
    path = line_file[len(line_file) - 1]
    if path == "-" * 24:
        skip = not skip
        continue
    if not skip:
        path1 = path.split(os.sep)[0]
        if not path1 in renamed:
            renamed.append(path1)
            newpath = sys.argv[2] + os.sep + path1
            proc = subprocess.run(["7z", "rn", sys.argv[1], path1, newpath], stdout=subprocess.DEVNULL, check=True)
saibotu
quelle