क्या सीधे 7z को टार में बदलना संभव है?


10

मेरे पास एक .7z फ़ाइल है जिसमें कई निर्देशिकाओं में ~ 360,000 चित्र हैं। मैं इसे एक .tar में बदलना चाहता हूं ताकि मैं इसे दूसरे कंप्यूटर में खोल सकूं। क्या फ़ाइलों को निकालने और उन्हें फिर से संपीड़ित करने से बेहतर तरीका है? क्या रूपांतरण सीधे करना संभव है?


8
आपको .7zदूसरे कंप्यूटर पर फ़ाइल खोलने से क्या रोक रहा है?
जॉर्डन

मेरे पास 7z को स्थापित करने के लिए गंतव्य पर व्यवस्थापक अधिकार नहीं हैं। मुझे पता है कि मैं स्रोत आदि से स्थापित कर सकता हूं ...
मोहम्मद मोगीमी

जवाबों:


8

नौकरी करने के लिए कुछ लिखना बहुत कठिन नहीं है। यहाँ एक उदाहरण पर्ल स्क्रिप्ट (मॉड्यूल पुरालेख :: Libarchive :: XS ) की आवश्यकता है।

#!/usr/bin/perl
use strict;
use warnings;
use Archive::Libarchive::XS qw(:all);

die "Usage: $0 in.7z out.tar" unless @ARGV == 2;
my ($infile, $outfile) = @ARGV;

my $in = archive_read_new();
archive_read_support_filter_none($in);
archive_read_support_format_7zip($in);

archive_read_open_filename($in, $infile, 10240) == ARCHIVE_OK
  or die "Error opening $infile: ", archive_error_string($in);

my $out = archive_write_new();
archive_write_set_format_ustar($out);
archive_write_open_filename($out, $outfile) == ARCHIVE_OK
  or die "Error opening $outfile: ", archive_error_string($out);

while (archive_read_next_header($in, my $entry) == ARCHIVE_OK) {
  archive_write_header($out, $entry) == ARCHIVE_OK
    or die archive_error_string($out);
  while (1) {
    my $size = archive_read_data($in, my $buff, 65536);
    die archive_error_string($in) if $size < 0; 
    last if $size == 0;
    archive_write_data($out, $buff) >= 0
      or die archive_error_string($out);
  }
} 

archive_read_free($in);
archive_write_close($out);
archive_write_free($out);

यदि आप एक tar.gz / tar.bz2 / लाइन tar.xz संग्रह, जोड़ना चाहते हैं तो archive_write_add_filter_gzip($out);या archive_write_add_filter_bzip2($out);या archive_tar_add_filter_xz($out);के बाद archive_write_set_formatलाइन।

यह कोई अस्थायी डिस्क स्थान (केवल आउटपुट टार फ़ाइल के लिए स्थान) का उपयोग करता है और बहुत कम रैम (पर्ल के लिए कुछ एमबी, लेकिन यह एक समय में फ़ाइलों को एक ब्लॉक के साथ काम करता है, इसलिए यदि आपकी फ़ाइलें बड़ी हैं तो यह समस्या नहीं है आपकी राम से)।


15

.7zअभिलेखागार अक्सर किसी प्रकार के एल्गोरिथ्म के साथ संपीड़ित होते हैं, जबकि .tarअभिलेखागार केवल अभिलेखागार होते हैं।

वे अपने दायरे में भिन्न होते हैं, और ज्यादातर मामलों में एक रूपांतरण के लिए एक वैकल्पिक अपघटन की आवश्यकता होती है जो स्रोत संग्रह के निष्कर्षण के बाद हमेशा होता है। यहां तक ​​कि अगर एक .7zसंग्रह किसी भी संपीड़न का उपयोग नहीं करेगा, तब भी इसे निष्कर्षण की आवश्यकता होगी।

यही कारण है कि किया जा रहा है ने कहा, आप [दबाव हटाना] / निकालने के लिए होती हैं / एक ही बार में स्रोत संग्रह rearchive, जवाब आप नहीं, कम से कम Ubuntu के डिफ़ॉल्ट उपकरण का उपयोग कर नहीं कर सकते क्योंकि है tarसे नहीं पढ़ सकते हैंstdin , तो आप पाइप नहीं कर सकते हैं 7zऔर tar। वैसे भी एक ही कमांड में सब कुछ स्वचालित करना बहुत आसान है:

mkdir tmp && 7z x <path_to_source_archive> -otmp && tar cf archive.tar tmp && rm -rf tmp

* <path_to_archive> = स्रोत .7zसंग्रह का पथ

स्रोत संग्रह की फ़ाइलों को डिस्क पर लिखने के लिए और निकाली गई फ़ाइलों को पढ़ने के लिए आवश्यक समय [डिकम्प्रेस] / दो चरणों में स्रोत संग्रह को निकालने / खोजने के लिए पूरे कार्य के लिए एक अड़चन है ज्यादातर ( पूरी तरह से नहीं) केवल) एक संभावित डिस्क की कम I / O गति के कारण, इसलिए एक आंशिक समाधान एक अस्थायी रैम रैमडिस्क को स्टोर करने के लिए होगा ताकि समग्र अड़चन को शून्य किया जा सके:

  1. रैमडिस्क के फाइल सिस्टम के लिए आरोह बिंदु बनाएँ: sudo mkdir /mnt/tmpfs
  2. रामडिस्क के फाइल सिस्टम को माउंट करें: sudo mount -t tmpfs -o size=<tmpfs_size> tmpfs /mnt/ramdisk* <tmpfs_size> = फाइल सिस्टम का आकार बाइट्स में * 10 3 (1, 1K, 1M, 1G, ...)
  3. स्रोत संग्रह के लिए * <path_to_archive> = पथ चलाएँmkdir /mnt/tmpfs/tmp && 7z x <path_to_source_archive> -o/mnt/tmpfs/tmp && tar cf archive.tar /mnt/tmpfs/tmp && rm -rf /mnt/tmpfs/tmp.7z
  4. रैमडिस्क के फाइल सिस्टम को अनमाउंट करें: sudo umount
  5. रैमडिस्क के फाइल सिस्टम के लिए आरोह बिंदु निकालें: sudo rmdir /mnt/tmpfs

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