Дан файл .zip со следующей структурой примера:

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

Мне нужно иметь возможность изменить эту внутреннюю файловую структуру, используя инструмент командной строки 7zip, например так:

1. Мне нужно переместить все существующие файлы в новую папку внутри архива (скажем, префикс сохраненных путей с "/myfolder")

  1. Мне нужно добавить еще одну папку с другими файлами (вне этого вопроса, решена)

Итак, без разархивирования я бы хотел получить следующую структуру:

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

Я знаю, как решить пункт 2, но пункт 1 (изменение внутренней структуры) вызывает у меня проблемы.

Причиной этого требования является то, что я работаю с ОЧЕНЬ большими и сложными архивами с единственной целью - переупорядочить файлы и добавить еще несколько одинаковым образом ко всем. Кажется контрпродуктивным разархивировать для каждого файла (это может занять до часа), когда я мог бы сделать это проще.

Кроме того, если есть другой инструмент, который может выполнить эту задачу лучше (например, НЕ 7zip, но какой-то другой бесплатный инструмент командной строки), я открыт для предложений.

Спасибо, любезно!

PS Я знаю, что при увеличении пути к каталогу около 248 символов может возникнуть проблема длины пути, но это приемлемо.

1 ответ1

1

Вы можете использовать команду 7z rn для перемещения файлов и папок внутри архивов. К сожалению, он не может переместить корневой каталог. Однако вы можете использовать скрипт, чтобы проанализировать вывод 7z l и сделать это.

Вот быстрый пример в Python: (7z должен быть доступен в 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)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .