Ubah struktur direktori .zip menggunakan baris perintah 7zip (lebih disukai) tanpa dekompresi

1

Diberikan .zip dengan struktur contoh berikut:

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

Saya harus dapat memodifikasi struktur file internal menggunakan alat baris perintah 7zip seperti:

1. Saya perlu memindahkan semua file yang ada ke folder baru di dalam arsip (katakan awalan jalur tersimpan dengan "/ myfolder")

  1. Saya perlu menambahkan folder lain dengan file lain (di luar pertanyaan ini, diselesaikan)

Jadi, tanpa membuka ritsleting, saya ingin memiliki struktur sebagai berikut:

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

Saya tahu bagaimana menyelesaikan poin 2, tetapi poin 1 (mengubah struktur internal) adalah yang memberi saya kesulitan.

Alasan untuk persyaratan ini adalah bahwa saya bekerja dengan arsip SANGAT besar dan kompleks dengan tujuan tunggal mengatur ulang file dan menambahkan beberapa lagi dengan cara yang sama untuk semua. Tampaknya kontraproduktif untuk unzip untuk setiap file (yang bisa memakan waktu hingga satu jam) ketika saya bisa melakukan ini dengan lebih mudah.

Juga, jika ada alat lain yang dapat melakukan tugas ini dengan lebih baik (yaitu BUKAN 7zip, tetapi beberapa alat baris perintah gratis lainnya ), saya terbuka untuk saran.

Terima kasih!

PS Saya sadar mungkin ada masalah panjang jalur saat meningkatkan lintasan direktori di dekat 248 karakter, tapi itu bisa diterima.

Florin Mircea
sumber
1
Saya tidak berpikir alat apa pun akan memiliki kemampuan itu. Anda mungkin dapat menulis sendiri sesuatu menggunakan salah satu bungkus 7zip API ...
DavidPostill

Jawaban:

2

Anda dapat menggunakan 7z rnperintah untuk memindahkan file dan folder di dalam arsip. Sayangnya itu tidak dapat memindahkan direktori root. Namun Anda dapat menggunakan skrip untuk mem-parsing output 7z ldan melakukannya.

Berikut ini adalah contoh cepat dalam Python: ( 7zharus tersedia dalam 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)
saibotu
sumber