লিনাক্সে আমি কীভাবে একটি জিপ / টিজিজেড তৈরি করতে পারি যে উইন্ডোজের যথাযথ ফাইল নাম রয়েছে?


26

বর্তমানে, tar -zcf arch.tgz files/*ইউটিএফ-তে ফাইলের নামগুলি এনকোড করা হয়েছে, সুতরাং উইন্ডোজ ব্যবহারকারীরা সমস্ত ফাইল অক্ষরে থাকা ফাইলের নাম দেখতে পান যা ইংরেজী নয় এবং এটি দিয়ে কিছুই করতে পারে না।

zip -qq -r arch.zip files/* একই আচরণ আছে।

আমি কীভাবে একটি জিপ / টিজিজেড সংরক্ষণাগার তৈরি করতে পারি যখন উইন্ডোজ ব্যবহারকারীরা যখন এট্র্যাক্ট করেন তখন সমস্ত ফাইলের নামগুলি সঠিকভাবে এনকোড করা থাকে?

উত্তর:


24

বর্তমানে, টার ইউটিএফ-এ ফাইলের নামগুলি এনকোড করে

প্রকৃতপক্ষে টার ফাইল নামগুলি মোটেও এনকোড / ডিকোড করে না, এটি কেবল ফাইল-সিস্টেমের বাইরে থেকে অনুলিপি করে। যদি আপনার লোকেলটি ইউটিএফ -8-ভিত্তিক হয় (অনেক আধুনিক লিনাক্স ডিস্ট্রোসের মতো) তবে এটি ইউটিএফ -8 হবে। দুর্ভাগ্যক্রমে উইন্ডোজ বাক্সের সিস্টেম কোডেজেট কখনও ইউটিএফ -8 হয় না, সুতরাং নামগুলি সর্বদা উইনআআআআআআআরের মতো সরঞ্জামগুলি বাদ দিয়ে ম্যাসেজ করা হবে যা অক্ষরটিকে পরিবর্তিত হতে দেয়।

সুতরাং নন-এএসসিআইআই ফাইল নামগুলির সাথে একটি জিপ ফাইল তৈরি করা অসম্ভব যা বিভিন্ন দেশের উইন্ডোজ এবং তাদের অন্তর্নির্মিত সংকোচিত ফোল্ডার সমর্থন জুড়ে কাজ করে।

এটি টার ও জিপ ফর্ম্যাটগুলির একটি সংকট যা এখানে কোনও স্থির বা সরবরাহিত এনকোডিংয়ের তথ্য নেই, সুতরাং ASCII ব্যতীত অক্ষরগুলি সর্বদা অ-বহনযোগ্য হবে। আপনার যদি একটি অ-এসসিআইআই সংরক্ষণাগার বিন্যাসের প্রয়োজন হয় তবে আপনাকে নতুন ফর্ম্যাটগুলির একটি যেমন সাম্প্রতিক 7z বা রাআর ব্যবহার করতে হবে। দুর্ভাগ্যক্রমে এগুলি এখনও দুর্বল; 7 জীপে আপনার -mcuস্যুইচ প্রয়োজন এবং রার এখনও ইউটিএফ -8 ব্যবহার করবে না যতক্ষণ না এটি কোডেজে অক্ষরগুলি সনাক্ত না করে।

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


দুর্দান্ত, ধন্যবাদ! দুর্ভাগ্যক্রমে, বেশিরভাগ ব্যবহারকারী 7z সম্পর্কে কিছুই জানেন না এবং রার মালিকানাধীন :(
কলিপ্টো

হ্যাঁ, এটি একটি সমস্যা। জিপ ব্যবহারকারীদের জন্য এখন পর্যন্ত সবচেয়ে ব্যবহারযোগ্য সমাধান, কারণ সমস্ত আধুনিক ওএসের পক্ষে এটির জন্য নেটিভ ইউআই সমর্থন রয়েছে। দুর্ভাগ্যক্রমে চরসেট সমস্যাটি আজ জিপ-এ সত্যিই সমাধানযোগ্য নয় (এবং অন্যান্য সংরক্ষণাগার ফর্ম্যাটে এটি এখনও সমস্যাজনক)।
বোবিনস

25

এখানে একটি সাধারণ পাইথন স্ক্রিপ্ট যা আমি উইন্ডোজটিতে ইউনিক্স থেকে ট্যারি ফাইলগুলি আনপ্যাক করার জন্য লিখেছি:

import tarfile

archive_name = "archive_name.tar"

def recover(name):
    return unicode(name, 'utf-8')

tar = tarfile.open(name=archive_name, mode='r', bufsize=16*1024)
updated = []
for m in tar.getmembers():
    m.name = recover(m.name)
    updated.append(m)

tar.extractall(members=updated)
tar.close()

অসাধারণ! এই স্ক্রিপ্টটি আমাকে একটি পুরানো সোলারিস সার্ভারে তৈরি করা একটি EUC-JP এনকোডযুক্ত টার ফাইল রূপান্তর করতে সহায়তা করেছে।
wm_eddie

স্যার, আপনি আমার জীবন বাঁচিয়েছেন।
Blessশ্বর

8

লিনাক্সে ডিফল্ট tar(জিএনইউ টার) ব্যবহার করে সমস্যাটি সমাধান হয়ে যায় ... --format=posixফাইলটি তৈরি করার সময় প্যারামিটার যুক্ত করা হয় ।

উদাহরণ স্বরূপ:
tar --format=posix -cf

উইন্ডোজ, ফাইল বের করে আনতে, আমি ব্যবহার bsdtar

ইন https://lists.gnu.org/archive/html/bug-tar/2005-02/msg00018.html শাস্ত্রে লেখা আছে (যেহেতু 2005 !!):

> ইউটিএফ -8 সমর্থিত হওয়া সম্পর্কে আমি চেঞ্জলগে কিছু পড়েছি। এর
অর্থ কী?
> আমি কোনও সংরক্ষণাগার তৈরির উপায় খুঁজে পাইনি
যা বিভিন্ন লোকেলের মধ্যে বিনিময়যোগ্য হবে ।

POSIX.1-2-2001 ফর্ম্যাট (টার - ফর্ম্যাট = পিক্সিক্স বা - ফর্ম্যাট = প্যাক্স) সংরক্ষণাগার তৈরি করার সময়, টার বর্তমান ফাইলগুলি থেকে ইউটিএফ -8 এ রূপান্তর করে এবং সেগুলি সংরক্ষণাগারে সংরক্ষণ করে। নিষ্কাশন করার সময়, বিপরীত অপারেশন করা হয়।

পিএস টাইপ করার পরিবর্তে --format=posixআপনি টাইপ করতে পারেন -H paxযা সংক্ষিপ্ত is


5

আমি বিশ্বাস করি আপনি নিজেই জিপ ধারক বিন্যাস নিয়ে সমস্যায় পড়ছেন। টার একই সমস্যায় ভুগতে পারে।

পরিবর্তে 7zip ( .7z) বা আরআর ( .rar) সংরক্ষণাগার ফর্ম্যাট ব্যবহার করুন। উভয়ই উইন্ডোজ এবং লিনাক্সের জন্য উপলব্ধ; p7zipসফ্টওয়্যার উভয় ফরম্যাটের পরিচালনা করে।

আমি শুধু তৈরি পরীক্ষিত .7z, .rar, .zip, এবং .tarউভয় WinXP এবং ডেবিয়ান 5, এবং ফাইল .7zএবং .rarফাইল দোকান / ফাইলের নামের সঠিকভাবে পুনঃস্থাপন যখন .zipএবং .tarফাইল না। পরীক্ষা সংরক্ষণাগার তৈরি করতে কোন সিস্টেমটি ব্যবহৃত হয় তা বিবেচ্য নয়।


5

উইন্ডোজ ব্যবহারকারীদের কাছ থেকে আনপ্যাক করা tarএবং zipফাইলগুলি নিয়ে আমার সমস্যা হয়েছিল । আমি কীভাবে "সংরক্ষণাগারটি কীভাবে কাজ করবে তা তৈরি করা যায়" এই প্রশ্নের উত্তর না দিলেও নীচের স্ক্রিপ্টগুলি মূল ওএস নির্বিশেষে আনপ্যাক tarএবং zipফাইলগুলি সঠিকভাবে আনতে সহায়তা করে ।

সর্তকতা: আর একবার সুর উৎস নিজে এনকোড করা (হয়েছে cp1251, cp866নিচের উদাহরণ মধ্যে)। কমান্ডলাইন বিকল্পগুলি ভবিষ্যতে একটি ভাল সমাধান হতে পারে।

আলকাতরা:

#!/usr/bin/env python

import tarfile
import codecs
import sys

def recover(name):
    return codecs.decode(name, 'cp1251')

for tar_filename in sys.argv[1:]:
    tar = tarfile.open(name=tar_filename, mode='r', bufsize=16*1024)
    updated = []
    for m in tar.getmembers():
        m.name = recover(m.name)
        updated.append(m)
    tar.extractall(members=updated)
    tar.close()

জিপ:

#!/usr/bin/env python

import zipfile
import os
import codecs
import sys

def recover(name):
    return codecs.decode(name, 'cp866')

for filename in sys.argv[1:]:
    archive = zipfile.ZipFile(filename, 'r')
    infolist = archive.infolist()
    for i in infolist:
        f = recover(i.filename)
        print f
        if f.endswith("/"):
            os.makedirs(os.path.dirname(f))
        else:
            open(f, 'w').write(archive.read(i))
    archive.close()

ইউপিডি 2018-01-02 : আমি chardetডেটার কাঁচা অংশের সঠিক এনকোডিং অনুমান করতে প্যাকেজটি ব্যবহার করি। এখন স্ক্রিপ্টটি আমার সমস্ত খারাপ সংরক্ষণাগারের পাশাপাশি বাক্স থেকে খুব ভালভাবে কাজ করে।

বিষয়গুলি নোট করুন:

  1. এনকোডিং অনুমান ইঞ্জিনের জন্য পাঠ্যের একটি বড় টুকরো তৈরি করতে সমস্ত ফাইলের নামগুলি একক স্ট্রিংয়ের সাথে উত্তোলন এবং একত্রীকরণ করা হয়। এর অর্থ হ'ল প্রতিটি ফাইল আলাদাভাবে স্ক্রু করা অনুমানটি নষ্ট করতে পারে।
  2. একটি ভাল ইউনিকোড পাঠ্য ( chardetসাধারণ ইউনিকোড অবজেক্টের সাথে কাজ করে না) হ্যান্ডেল করার জন্য বিশেষ দ্রুতগামী পথ ব্যবহার করা হত ।
  3. নথিকে পরীক্ষার জন্য যুক্ত করা হয় এবং প্রদর্শিত হয় যে নরমালাইজার যুক্তিসঙ্গত সংক্ষিপ্ত স্ট্রিংগুলিতে যে কোনও এনকোডিংকে স্বীকৃতি দেয়।

চূড়ান্ত সংস্করণ:

#!/usr/bin/env python2
# coding=utf-8

import zipfile
import os
import codecs
import sys

import chardet


def make_encoding_normalizer(txt):
    u'''
    Takes raw data and returns function to normalize encoding of the data.
        * `txt` is either unicode or raw bytes;
        * `chardet` library is used to guess the correct encoding.

    >>> n_unicode = make_encoding_normalizer(u"Привет!")
    >>> print n_unicode(u"День добрый")
    День добрый

    >>> n_cp1251 = make_encoding_normalizer(u"Привет!".encode('cp1251'))
    >>> print n_cp1251(u"День добрый".encode('cp1251'))
    День добрый
    >>> type(n_cp1251(u"День добрый".encode('cp1251')))
    <type 'unicode'>
    '''
    if isinstance(txt, unicode):
        return lambda text: text

    enc = chardet.detect(txt)['encoding']
    return lambda file_name: codecs.decode(file_name, enc)


for filename in sys.argv[1:]:
    archive = zipfile.ZipFile(filename, 'r')
    infolist = archive.infolist()

    probe_txt = "\n".join(i.filename for i in infolist)
    normalizer = make_encoding_normalizer(probe_txt)

    for i in infolist:
        print i.filename
        f = normalizer(i.filename)
        print f
        dirname = os.path.dirname(f)
        if dirname:
            assert os.path.abspath(dirname).startswith(os.path.abspath(".")), \
                "Security violation"
            if not os.path.exists(dirname):
                os.makedirs(dirname)
        if not f.endswith("/"):
            open(f, 'w').write(archive.read(i))
    archive.close()


if __name__ == '__main__' and len(sys.argv) == 1:
    # Hack for Python 2.x to support unicode source files as doctest sources.
    reload(sys)
    sys.setdefaultencoding("UTF-8")

    import doctest
    doctest.testmod()

    print "If there are no messages above, the script passes all tests."

আপনার প্রোগ্রামের জন্য আপনাকে ধন্যবাদ! দুঃখজনক ব্যাপার জিপ প্রোগ্রাম পাইথন 3 এর অধীন কাজ করে না, কিন্তু এটা পাইথন 2. অধীনে কাজ করে
beroal

@ বেরোল, আমি স্ক্রিপ্ট আপডেট করেছি। এখন এটি ফায়ারফক্সের জন্য এনকোডিংটি স্বয়ংক্রিয়ভাবে আবিষ্কার করতে মোজিলা দ্বারা বিকাশিত ইঞ্জিন ব্যবহার করে।
dmitry_romanov 10

4

POSIX-1.2001 নির্দিষ্ট করে যে কীভাবে TAR UTF-8 ব্যবহার করে।

2007 সালের হিসাবে, পিকেজিআইপি অ্যাপনোটি.টিএক্সটি ( http://www.pkware.com/documents/ کیسstudies / APPNOTE.TXT ) এর চেঞ্জলগ সংস্করণ 6.3.0 নির্দিষ্ট করেছে যে কীভাবে জিপ ইউটিএফ -8 ব্যবহার করে।

কেবলমাত্র সরঞ্জামগুলি এই মানগুলিকে সঠিকভাবে সমর্থন করে, এটি একটি উন্মুক্ত প্রশ্ন remains

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