Bir zip'i dosya sistemine çıkarmadan bir zifte dönüştürmenin bir yolu var mı?


17

Geçici bir dizine çıkarmadan zipbir tararşivi arşive dönüştürmenin bir yolu var mı ? (ve kendi uygulamamı yazmadan tarveya unzip)


Zip arşivini dosya sistemine ayıklamak olarak takmayı sayıyor musunuz ? Eğer evet ise, o zaman libarchive ile herhangi bir şey çıkarmadan yapabilirsiniz, ancak kodlama içerir.
Celada

Böyle bir şey op görünüyor düşünüyorum superuser.com/questions/325504/... bunu başarmak için umut ediyor tür şeyler?
vfbsilva

Yanıtlar:


12

Bu artık PyPI'den kurulabilir komut olarak kullanılabilir, bu yazının sonuna bakın.


Bunu yapan herhangi bir "standart" yardımcı programı bilmiyorum, ama bu işlevselliğe ihtiyaç duyduğumda, ilk önce diske herhangi bir şey çıkarmadan ZIP Bzip2 sıkıştırılmış tar arşivlerine gitmek için aşağıdaki Python betiği yazdı:

#! /usr/bin/env python

"""zip2tar """

import sys
import os
from zipfile import ZipFile
import tarfile
import time

def main(ifn, ofn):
    with ZipFile(ifn) as zipf:
        with tarfile.open(ofn, 'w:bz2') as tarf:
            for zip_info in zipf.infolist():
                #print zip_info.filename, zip_info.file_size
                tar_info = tarfile.TarInfo(name=zip_info.filename)
                tar_info.size = zip_info.file_size
                tar_info.mtime = time.mktime(list(zip_info.date_time) +
                                         [-1, -1, -1])
                tarf.addfile(
                    tarinfo=tar_info,
                    fileobj=zipf.open(zip_info.filename)
                )

input_file_name = sys.argv[1]
output_file_name = os.path.splitext(input_file_name)[0] + '.tar.bz2'

main(input_file_name, output_file_name)

Sadece kaydedin zip2tarve çalıştırılabilir yapın veya kaydedin zip2tar.pyve çalıştırın python zip2tar.py. Komut dosyasına bağımsız değişken olarak ZIP dosya adını sağlayın, çıktı dosya adı xyz.zipolacaktır xyz.tar.bz2.

Bzip2 sıkıştırılmış çıktı normalde zip dosyasından çok daha küçüktür, çünkü ikincisi birden çok dosya üzerinde sıkıştırma desenleri kullanmaz, ancak Bzip2 dosyasındaki bir şey yanlışsa daha sonra dosyayı kurtarma şansı daha azdır.

Eğer istemiyorsanız çıkışı, kaldır sıkıştırılmış :bz2ve .bz2koddan.


Eğer varsa pipbir python3 ortamında kurulu, yapabileceğiniz:

pip3 install ruamel.zip2tar

zip2taryukarıdaki bir komut satırı yardımcı programı almak için (feragat: Ben bu paketin yazarıyım).


1
Güzel. Komut dosyası, dosya biçimi değiştirme zamanı ve izinleri gibi arşiv biçimi değişikliği gibi meta verileri kopyalamaya çalışmaz, ancak bence bunu kolayca ekleyebilirsiniz.
Celada

@Celada Dosya değiştirme süresini ekledim (kopyaladığım ve orjinal kodumdan yapıştırarak kaçırdım), ZIP standardının aslında izinlere sahip olup olmadığından emin değilim, AFAIK (modern) tar, ZIP daha fazla Windows odaklı olduğundan daha eksiksiz .
Anthon

Tam aradığım şey. Böyle bir yardımcı programın standart unix paketlerinden kullanılabilir olmasını bekledim. Bunun lisansı nedir? Belki bazı genellemelerden sonra bazı paketlere (örneğin Debian'ın devutils) dahil edilmesini öneriyorum.
rbrito

Başka bir yorum: timeeksik referans an import.
rbrito

@rbrito Bunu PyPI'de yayınlayacağım, herhangi bir dağıtım oradan alabilir. Tıpkı bazılarının ruamel.yaml paketimle yaptığı gibi. timeYorum için teşekkürler , cevabı güncelliyorum
Anthon

5

tarKomut dosyası sistemleriyle ilgilenir. Girdi, daha sonra bir dosya sisteminden (çok sayıda meta veri dahil) okuduğu dosyaların listesidir. tarKomutun okuyabilmesi için zip dosyasını bir dosya sistemi olarak sunmanız gerekir.

Sanal Dosya Sistemi - AVFS , herhangi bir programın FUSE aracılığıyla standart bir dosya sistemi arabirimi aracılığıyla arşivlenmiş veya sıkıştırılmış dosyaların içine bakmasına izin verir .

Orada bazı ayrıntılı bilgiler aşağıda AVF'ler-sigorta Benioku'da ve bazı dağılımlar sahip paketleri bunun için.

Birinde AVFS yüklüyse,

mountavfs
cd ~/.avfs/path/to/somefile.zip#
tar -cvf /path/whatever.tar .

AVFS, dosya sahipliği gibi zip'te eksik olan dosya sistemi için bu katranın alacağı bilgileri dolduracaktır.


0

İşte ZIP arşivini eşleşen bir TAR.GZ arşivine OnTheFly'e dönüştüren küçük bir snippet.

ZIP arşivini anında TAR arşivine dönüştürün

# File: zip2tar.py
#
# Convert ZIP archive to TAR.GZ archive.
#
# Written by Fredrik Lundh, March 2005.

# helpers (tweak as necessary)

def getuser():
    # return user name and user id
    return "anonymous", 1000

def getmode(name, data):
    # return mode ("b" or "t") for the given file.
    # you can do this either by inspecting the name, or
    # the actual data (e.g. by looking for non-ascii, non-
    # line-feed data).
    return "t" # assume everything's text, for now

#
# main

import tarfile
import zipfile

import glob, os, StringIO, sys, time

now = time.time()

user = getuser()

def fixup(infile):

    file, ext = os.path.splitext(infile)

    outfile = file + ".tar.gz"
    dirname = os.path.basename(file)

    print outfile

    zip = zipfile.ZipFile(infile, "r")

    tar = tarfile.open(outfile, "w:gz")
    tar.posix = 1

    for name in zip.namelist():

        if name.endswith("/"):
            continue

        data = zip.read(name)
        if getmode(name, data) == "t":
            data = data.replace("\r\n", "\n")

        tarinfo = tarfile.TarInfo()
        tarinfo.name = name
        tarinfo.size = len(data)
        tarinfo.mtime = now
        tarinfo.uname = tarinfo.gname = user[0]
        tarinfo.uid = tarinfo.gid = user[1]
        tar.addfile(tarinfo, StringIO.StringIO(data))

    tar.close()
    zip.close()

# convert all ZIP files in the current directory
for file in glob.glob("*.zip"):
    fixup(file)

Kaynak

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.