क्या फाइल सिस्टम पर निकाले बिना एक ज़िप को टार में बदलने का कोई तरीका है?


17

पहले एक अस्थायी निर्देशिका को निकाले बिना एक zipसंग्रह को एक tarपुरालेख में बदलने का एक तरीका है ? (और के अपने खुद के कार्यान्वयन लेखन के बिना tarया unzip)


क्या आप ज़िप संग्रह को फाइल सिस्टम में निकालने के रूप में बढ़ते गिनती करते हैं? यदि हाँ, तो आप इसके साथ निकासी कुछ भी बिना कर सकते हैं libarchive लेकिन यह है कि कोडिंग शामिल है।
सेलडा

मुझे लगता है कि ऑप इस सुपरसर्वर.com / questions / 325504/ के लिए कुछ दिखता है। क्या यह उस तरह की चीज है जिसे आप प्राप्त करने की उम्मीद कर रहे हैं?
vfbsilva

जवाबों:


12

यह अब PyPI से इंस्टॉल करने योग्य कमांड के रूप में उपलब्ध है, इस पोस्ट का अंत देखें।


मैं किसी भी "मानक" उपयोगिता के बारे में नहीं जानता जो ऐसा करता है, लेकिन जब मुझे इस कार्यक्षमता की आवश्यकता थी, तो मैंने जिप से Bzip2 पर जाने के लिए निम्नलिखित पायथन लिपि लिखी, जिसमें पहले डिस्क पर कुछ भी निकाले बिना टार अभिलेखागार संकुचित थे:

#! /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)

बस इसे बचाने के लिए zip2tarऔर इसे निष्पादन योग्य बनाने या इसे बचाने zip2tar.pyऔर चलाने के लिए python zip2tar.py। स्क्रिप्ट के लिए एक तर्क के रूप में ज़िप फ़ाइल नाम प्रदान करें, इसके लिए आउटपुट फ़ाइल नाम xyz.zipहोगा xyz.tar.bz2

Bzip2 संपीड़ित आउटपुट आमतौर पर ज़िप फ़ाइल की तुलना में बहुत छोटा होता है क्योंकि उत्तरार्द्ध कई फ़ाइलों पर संपीड़न पैटर्न का उपयोग नहीं करता है, लेकिन बाद में फ़ाइल को पुनर्प्राप्त करने की कम संभावना होती है यदि Bzip2 फ़ाइल में कुछ गलत है।

यदि आप आउटपुट को संपीड़ित नहीं करना चाहते हैं, तो कोड से निकालें :bz2और निकालें .bz2


यदि आपने pippython3 वातावरण में स्थापित किया है, तो आप कर सकते हैं:

pip3 install ruamel.zip2tar

zip2tarऊपर एक कमांडलाइन उपयोगिता प्राप्त करने के लिए (अस्वीकरण: मैं उस पैकेज का लेखक हूं)।


1
अच्छा है। ऐसा लगता है कि स्क्रिप्ट मेटाडेटा की प्रतिलिपि बनाने का कोई प्रयास नहीं करती है जैसे फ़ाइल संशोधन समय और संग्रह प्रारूप में अनुमतियाँ बदल जाती हैं, लेकिन मुझे लगता है कि आप इसे बहुत आसानी से जोड़ सकते हैं।
सेलडा

@ कैलाडा मैंने फ़ाइल संशोधन समय को जोड़ा (याद किया कि मेरे मूल कोड से कॉपी और पेस्ट करते समय), मुझे यकीन नहीं है कि ज़िप मानक में वास्तव में अनुमतियाँ हैं, AFAIK (आधुनिक) टार उस संबंध में अधिक पूर्ण है जिसमें ज़िप अधिक विंडोज उन्मुख है। ।
एंथन जूल

ठीक वही जो मेरे द्वारा खोजा जा रहा था। मुझे उम्मीद थी कि इस तरह की एक उपयोगिता मानक यूनिक्स पैकेज से उपलब्ध होगी। इसका लाइसेंस क्या है? मैं इसे कुछ पैकेजों में शामिल करने का प्रस्ताव देना चाहूंगा (जैसे, डेबियन की शैतानियाँ), शायद कुछ सामान्यीकरण के बाद।
रबितो

एक और टिप्पणी: timeअभाव का संदर्भ ए import
रबितो

@rbrito मैं इसे PyPI पर पोस्ट करूंगा, कोई भी डिस्ट्रो इसे वहां से उठा सकता है। जैसे कुछ मेरी बरबादी के साथ करते हैं। श्याम पैकेज। timeटिप्पणी के लिए धन्यवाद , मैं जवाब अपडेट करता हूं
एंथन जूल

5

tarआदेश फाइल सिस्टम से संबंधित है। यह इनपुट फाइलों की एक सूची है जिसे वह तब एक फाइल सिस्टम (बहुत मेटाडेटा सहित) से पढ़ता है। tarकमांड को पढ़ने के लिए आपको जिप फाइल को फाइल सिस्टम के रूप में प्रस्तुत करना होगा ।

एक वर्चुअल फाइल सिस्टम - एवीएफएस किसी भी प्रोग्राम को FUSE के माध्यम से एक मानक फ़ाइल सिस्टम इंटरफेस के माध्यम से संग्रहीत या संकुचित फ़ाइलों के अंदर देखने की अनुमति देगा ।

अवाफ़-फ़्यूज़ रीडमे में कुछ विस्तृत जानकारी है और कुछ वितरण में इसके लिए पैकेज हैं।

एक आपके पास AVFS स्थापित है, तो आप कर सकते हैं

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

AVFS फ़ाइल सिस्टम के लिए किसी भी जानकारी को भरेगा, जो ज़िप से गायब है, फ़ाइल स्वामित्व की तरह, वह टार उठाएगा।


0

यहाँ एक छोटा सा स्निपेट है, जो ज़िप संग्रह को मिलान TAR.GZ संग्रह पर TheTheFly में परिवर्तित करता है।

मक्खी पर TAR संग्रह के लिए ज़िप संग्रह कन्वर्ट

# 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)

स्रोत

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.