7z'yi tar'a doğrudan dönüştürmek mümkün mü?


10

Birden fazla dizinde ~ 360.000 görüntü içeren bir .7z dosyam var. Başka bir bilgisayarda açabilmek için .tar biçimine dönüştürmek istiyorum. Dosyalara ayıklamak ve tekrar sıkıştırmaktan daha iyi bir yol var mı? Dönüşümü doğrudan yapmak mümkün müdür?


8
.7zDosyayı başka bir bilgisayarda açmanızı engelleyen nedir ?
Ürdün

7z'yi yükleme hedefinde yönetici haklarına sahip değilim. Kaynaktan yükleyebileceğimi biliyorum ...
Mohammad Moghimi

Yanıtlar:


8

İşi yapmak için bir şeyler yazmak çok zor değil. Örnek bir Perl betiği ( Archive :: Libarchive :: XS modülünü gerektirir ).

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

Eğer bir tar.gz / tar.bz2 / tar.xz arşiv eklemek çizgi isteseydim archive_write_add_filter_gzip($out);ya archive_write_add_filter_bzip2($out);ya archive_tar_add_filter_xz($out);sonra archive_write_set_formathat.

Bu, geçici disk alanı (yalnızca çıktı tar dosyası için alan) ve çok az RAM (perl için sadece birkaç MB kullanır, ancak dosyalar ile bir seferde bir blok halinde çalışır, bu nedenle dosyalarınız daha büyükse sorun değildir RAM'inizden).


15

.7zarşivler genellikle bir tür algoritma ile sıkıştırılmış .tararşivlerdir, arşivler ise sadece arşivlerdir.

Kapsamları farklıdır ve çoğu durumda bir dönüşüm her zaman isteğe bağlı bir dekompresyon gerektirir ve ardından her zaman kaynak arşivin çıkarılması gerekir. Bir .7zarşiv herhangi bir sıkıştırma kullanmasa bile, yine de çıkarılması gerekir.

Eğer [kaldırmakta] / özü amaçladıysanız Bu varlık dedi / kerede kaynak arşivini REArşiv, cevap çünkü, en azından Ubuntu'nun varsayılan araçlarını kullanarak değil olamaz tarokuma yapamıyorstdin böylece boru olamaz, 7zve tar. Her neyse, tek bir komutla her şeyi otomatikleştirmek çok kolaydır:

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

* <path_to_archive> = kaynak .7zarşivi yolu

Ayrıca, kaynak arşivi dosyalarının diske yazılması ve kaynak arşivi iki adımda [sıkıştırmasını açmak / ayıklamak / yeniden aramak için okunan dosyaların okunması için gereken süre çoğunlukla tüm görev için bir darboğazdır ( yalnızca) potansiyel bir diskin düşük G / Ç hızından dolayı, kısmi bir çözüm, genel darboğazın neredeyse tamamen ortadan kaldırılması için geçici dosyaların ramdisk'e depolanması olacaktır:

  1. Ramdisk'in dosya sistemi için bağlama noktası oluşturun: sudo mkdir /mnt/tmpfs
  2. Ramdisk'in dosya sistemini bağlayın : sudo mount -t tmpfs -o size=<tmpfs_size> tmpfs /mnt/ramdisk* <tmpfs_size> = dosya sisteminin bayt cinsinden boyutu * 10 3 (1, 1K, 1M, 1G, ...)
  3. Run 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* <path_to_archive> = kaynak .7zarşivi yolu
  4. Ramdisk'in dosya sistemini çıkarın: sudo umount
  5. Ramdisk'in dosya sistemi için bağlama noktasını kaldırın: sudo rmdir /mnt/tmpfs

Yorumlar uzun tartışmalar için değildir; bu sohbet sohbete taşındı .
Mitch
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.