Geçici bir dizine çıkarmadan zip
bir tar
arşivi arşive dönüştürmenin bir yolu var mı ? (ve kendi uygulamamı yazmadan tar
veya unzip
)
Geçici bir dizine çıkarmadan zip
bir tar
arşivi arşive dönüştürmenin bir yolu var mı ? (ve kendi uygulamamı yazmadan tar
veya unzip
)
Yanıtlar:
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 zip2tar
ve çalıştırılabilir yapın veya kaydedin zip2tar.py
ve ç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.zip
olacaktı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ış :bz2
ve .bz2
koddan.
Eğer varsa pip
bir python3 ortamında kurulu, yapabileceğiniz:
pip3 install ruamel.zip2tar
zip2tar
yukarıdaki bir komut satırı yardımcı programı almak için (feragat: Ben bu paketin yazarıyım).
time
eksik referans an import
.
time
Yorum için teşekkürler , cevabı güncelliyorum
tar
Komut dosyası sistemleriyle ilgilenir. Girdi, daha sonra bir dosya sisteminden (çok sayıda meta veri dahil) okuduğu dosyaların listesidir. tar
Komutun 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.
İş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)