প্রথমে কোনও অস্থায়ী ডিরেক্টরিতে না zip
গিয়ে কোনও tar
সংরক্ষণাগারকে কোনও সংরক্ষণাগারে রূপান্তর করার কোনও উপায় আছে কি ? (এবং আমার নিজের প্রয়োগ প্রয়োগ না লিখে tar
বা unzip
)
প্রথমে কোনও অস্থায়ী ডিরেক্টরিতে না zip
গিয়ে কোনও tar
সংরক্ষণাগারকে কোনও সংরক্ষণাগারে রূপান্তর করার কোনও উপায় আছে কি ? (এবং আমার নিজের প্রয়োগ প্রয়োগ না লিখে tar
বা unzip
)
উত্তর:
এটি এখন পাইপিআই থেকে ইনস্টলযোগ্য কমান্ড হিসাবে উপলভ্য, এই পোস্টের শেষে দেখুন।
আমি এমন কোনও "স্ট্যান্ডার্ড" ইউটিলিটিটি জানি না যা এর আগে হয় তবে আমি যখন এই কার্যকারিতাটির প্রয়োজন তখন আমি প্রথমে ডিস্কে কিছু না বের করে জিপ 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
উপরোক্ত কমান্ডলাইন ইউটিলিটি পেতে (দাবি অস্বীকার: আমি সেই প্যাকেজের লেখক)।
time
অভাব রয়েছে import
।
time
মন্তব্যের জন্য ধন্যবাদ , আমি উত্তরটি আপডেট করছি
tar
কমান্ড ফাইল সিস্টেম নিয়ে কাজ করে। এটি ইনপুট হ'ল ফাইলগুলির একটি তালিকা যা পরে এটি একটি ফাইল সিস্টেম থেকে পড়ে (প্রচুর মেটাডেটা সহ)। tar
কমান্ডটি পড়ার জন্য আপনাকে জিপ ফাইলটি ফাইল সিস্টেম হিসাবে উপস্থাপন করতে হবে।
একটি ভার্চুয়াল ফাইল সিস্টেম - এভিএফএস কোনও প্রোগ্রাম FUSE এর মাধ্যমে একটি স্ট্যান্ডার্ড ফাইল সিস্টেম ইন্টারফেসের মাধ্যমে সংরক্ষণাগারভুক্ত বা সংক্ষেপিত ফাইলগুলির অভ্যন্তরে দেখার অনুমতি দেয় ।
সেখানে কিছু বিস্তারিত তথ্য রয়েছে avfs-ফিউজ রিডমি এবং কিছু ডিস্ট্রিবিউশন আছে প্যাকেজ জন্য।
আপনার একটি এভিএফএস ইনস্টল করা আছে, তারপরে আপনি এটি করতে পারেন
mountavfs
cd ~/.avfs/path/to/somefile.zip#
tar -cvf /path/whatever.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)