একটি জিপ ফাইল সিস্টেমে না বের করে তারে কি রূপান্তর করার কোনও উপায় আছে?


17

প্রথমে কোনও অস্থায়ী ডিরেক্টরিতে না zipগিয়ে কোনও tarসংরক্ষণাগারকে কোনও সংরক্ষণাগারে রূপান্তর করার কোনও উপায় আছে কি ? (এবং আমার নিজের প্রয়োগ প্রয়োগ না লিখে tarবা unzip)


আপনি জিপ সংরক্ষণাগারটিকে মাউন্ট করে ফাইল-সিস্টেম থেকে বের করা হিসাবে গণনা করছেন ? যদি হ্যাঁ, তবে আপনি লিবারচাইভের সাথে কোনও নিষ্কাশন ছাড়াই এটি করতে পারেন তবে এতে কোডিং জড়িত।
সেলেদা

আমি মনে করি অপারেশনটি এই সুপারসার / ডকুমেন্টস /325504/ … এর মতো কিছু খুঁজবে এটি কি এমন এক জিনিস যা আপনি আশা করছেন?
vfbsilva

উত্তর:


12

এটি এখন পাইপিআই থেকে ইনস্টলযোগ্য কমান্ড হিসাবে উপলভ্য, এই পোস্টের শেষে দেখুন।


আমি এমন কোনও "স্ট্যান্ডার্ড" ইউটিলিটিটি জানি না যা এর আগে হয় তবে আমি যখন এই কার্যকারিতাটির প্রয়োজন তখন আমি প্রথমে ডিস্কে কিছু না বের করে জিপ 2 থেকে বিজিপ 2 সংক্ষেপিত টার আর্কাইভে যেতে নীচের পাইথন স্ক্রিপ্টটি লিখেছিলাম:

#! /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কোড থেকে।


আপনি যদি pipপাইথন 3 পরিবেশে ইনস্টল করেন তবে আপনি এটি করতে পারেন:

pip3 install ruamel.zip2tar

zip2tarউপরোক্ত কমান্ডলাইন ইউটিলিটি পেতে (দাবি অস্বীকার: আমি সেই প্যাকেজের লেখক)।


1
সুন্দর. দেখে মনে হচ্ছে স্ক্রিপ্টটি সংরক্ষণাগার বিন্যাসের পরিবর্তন জুড়ে মেটাডেটা যেমন ফাইল পরিবর্তনের সময় এবং অনুমতিগুলির অনুলিপি করার কোনও প্রচেষ্টা করে না, তবে আমি মনে করি আপনি এটি খুব সহজেই যুক্ত করতে পারেন।
সেলেদা

@ ক্যালাডা আমি ফাইল সংশোধনের সময় যুক্ত করেছি (মিস করেছিলাম যে আমার অরজিনাল কোডটি অনুলিপি করে এবং পেস্ট করার সময়), আমি নিশ্চিত নই যে জিপ স্ট্যান্ডার্ডটিতে আসলে অনুমতি আছে কিনা, আফিক (আধুনিক) টার বেশি সেই সাথে জিপের সাথে উইন্ডোজমুখী হওয়ার সাথে আরও পূর্ণ ।
অ্যান্থন

ঠিক আমি খুঁজছেন ছিল কি. আমি স্ট্যান্ডার্ড ইউনিক্স প্যাকেজগুলি থেকে এর মতো একটি ইউটিলিটি উপলব্ধ হওয়ার প্রত্যাশা করেছি। এর লাইসেন্স কী? আমি এটিকে কিছু প্যাকেজগুলিতে অন্তর্ভুক্ত করার প্রস্তাব দিতে চাই (উদাহরণস্বরূপ, দেবিয়ান ডিভুটিলস), সম্ভবত কিছু সাধারণকরণের পরে।
rbrito

আরেকটি মন্তব্য: রেফারেন্সটির timeঅভাব রয়েছে import
rbrito

@rbrito আমি এটি পিপিআইতে পোস্ট করব, যে কোনও ডিস্ট্রো সেখান থেকে এটি নিতে পারে। ঠিক যেমন কিছু আমার রুমেল.আইএমএল প্যাকেজটি করে। timeমন্তব্যের জন্য ধন্যবাদ , আমি উত্তরটি আপডেট করছি
অ্যান্থন

5

tarকমান্ড ফাইল সিস্টেম নিয়ে কাজ করে। এটি ইনপুট হ'ল ফাইলগুলির একটি তালিকা যা পরে এটি একটি ফাইল সিস্টেম থেকে পড়ে (প্রচুর মেটাডেটা সহ)। tarকমান্ডটি পড়ার জন্য আপনাকে জিপ ফাইলটি ফাইল সিস্টেম হিসাবে উপস্থাপন করতে হবে।

একটি ভার্চুয়াল ফাইল সিস্টেম - এভিএফএস কোনও প্রোগ্রাম FUSE এর মাধ্যমে একটি স্ট্যান্ডার্ড ফাইল সিস্টেম ইন্টারফেসের মাধ্যমে সংরক্ষণাগারভুক্ত বা সংক্ষেপিত ফাইলগুলির অভ্যন্তরে দেখার অনুমতি দেয় ।

সেখানে কিছু বিস্তারিত তথ্য রয়েছে avfs-ফিউজ রিডমি এবং কিছু ডিস্ট্রিবিউশন আছে প্যাকেজ জন্য।

আপনার একটি এভিএফএস ইনস্টল করা আছে, তারপরে আপনি এটি করতে পারেন

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

জিভিপ থেকে অনুপস্থিত ফাইল সিস্টেমের যে কোনও তথ্য যেমন এভিএফএস পূরণ করবে, যেমন ফাইলের মালিকানা, সেই টার বাছাই করবে।


0

এখানে একটি ছোট স্নিপেট যা একটি জিপ সংরক্ষণাগারটিকে একটি টিআর.জিজেড সংরক্ষণাগারটি অনফ্লাইতে রূপান্তর করে।

জিপ সংরক্ষণাগারটি ফ্লাইটে টিআরআরআর্কাইভে রূপান্তর করুন

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

সূত্র

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.