1 votes

Modifier la structure du répertoire .zip en utilisant la ligne de commande de 7zip (de préférence) sans décompresser

Étant donné un fichier .zip avec la structure d'exemple suivante:

/dossier1/
  fichier1.1.txt
  fichier1.2.txt
/dossier2/
  fichier2.1.txt
  fichier2.2.txt
fichier1.txt
fichier2.txt

J'ai besoin de pouvoir modifier cette structure interne de fichiers en utilisant l'outil en ligne de commande 7zip de la manière suivante:

1. Je dois déplacer tous les fichiers existants dans un nouveau dossier à l'intérieur de l'archive (disons préfixer les chemins stockés avec "/mondossier")

  1. Je dois ajouter un autre dossier avec d'autres fichiers (en dehors de cette question, résolu)

Ainsi, sans décompresser, je voudrais obtenir la structure suivante en résultat:

/mondossier/
  fichier1.txt
  fichier2.txt
/donnees/
  /dossier1/
    fichier1.1.txt
    fichier1.2.txt
  /dossier2/
    fichier2.1.txt
    fichier2.2.txt
  fichier1.txt
  fichier2.txt

Je sais comment résoudre le point 2, mais le point 1 (modification de la structure interne) est celui qui me pose problème.

La raison de cette exigence est que je travaille avec des archives très grandes et complexes dans le seul but de réorganiser les fichiers et d'en ajouter quelques-uns de la même manière à tous. Il semble contre-productif de décompresser chaque fichier (cela pourrait prendre jusqu'à une heure) alors que je pourrais faire cela plus facilement.

De plus, s'il existe un autre outil qui peut effectuer cette tâche mieux (c'est-à-dire PAS 7zip, mais un autre outil en ligne de commande gratuit), je suis ouvert aux suggestions.

Merci beaucoup!

P.S. Je suis conscient qu'il pourrait y avoir un problème de longueur de chemin lorsque le chemin du répertoire dépasse environ 248 caractères, mais cela est acceptable.

2voto

saibotu Points 21

Vous pouvez utiliser la commande 7z rn pour déplacer des fichiers et des dossiers à l'intérieur des archives. Malheureusement, il ne peut pas déplacer le répertoire racine. Vous pouvez cependant utiliser un script pour analyser la sortie de la commande 7z l et le faire.

Voici un exemple rapide en Python : (7z doit être disponible dans le PATH)

import os;
import subprocess;
import sys;

if len(sys.argv) < 3:
    print("Syntaxe : " + sys.argv[0] + "  ")
    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)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X