Modifique a estrutura de diretório .zip usando a linha de comando 7zip (prefferably) sem descompactar

0

Dado um .zip com a seguinte estrutura de exemplo:

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

Eu preciso ser capaz de modificar essa estrutura de arquivos internos usando a ferramenta de linha de comando 7zip da seguinte forma:

1. Eu preciso mover todos os arquivos existentes para uma nova pasta dentro do arquivo (digamos, prefixar os caminhos armazenados com "/ myfolder")

  1. Eu preciso adicionar outra pasta com outros arquivos (fora dessa questão, resolvida)

Então, sem descompactar, eu gostaria de ter a seguinte estrutura como resultado:

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

Eu sei como resolver o ponto 2, mas o ponto 1 (mudando a estrutura interna) é o que me causa problemas.

A razão para este requisito é que eu estou trabalhando com arquivos muito grandes e complexos com o único propósito de reorganizar os arquivos e adicionar mais alguns da mesma maneira para todos. Parece contraproducente descompactar cada arquivo (que poderia levar até uma hora) quando eu poderia fazer isso mais facilmente.

Além disso, se houver outra ferramenta que possa executar essa tarefa melhor (por exemplo, NÃO é 7zip, mas alguma outra ferramenta de linha de comando gratuita ), estou aberto a sugestões.

Obrigado gentilmente!

P.S. Estou ciente de que pode haver um problema de comprimento de caminho ao aumentar o caminho do diretório próximo a 248 caracteres, mas isso é aceitável.

    
por Florin Mircea 16.08.2016 / 11:49

1 resposta

1

Você pode usar o comando 7z rn para mover arquivos e pastas dentro de arquivos. Infelizmente, não é possível mover o diretório raiz. No entanto, você pode usar um script para analisar a saída de 7z l e fazê-lo.

Aqui está um exemplo rápido em Python: ( 7z tem que estar disponível em PATH)

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)
    
por 17.08.2016 / 10:58