Apakah mungkin untuk mengkonversi 7z ke tar secara langsung?

10

Saya memiliki file .7z yang berisi ~ 360.000 gambar di banyak direktori. Saya ingin mengonversinya menjadi .tar sehingga saya dapat membukanya di komputer lain. Apakah ada cara yang lebih baik daripada mengekstraknya ke file dan mengompresnya lagi? Apakah mungkin melakukan konversi secara langsung?

Mohammad Moghimi
sumber
8
Apa yang mencegah Anda membuka .7zfile di komputer lain?
Jordan
Saya tidak punya hak admin di tujuan untuk menginstal 7z. Saya tahu saya dapat menginstal dari sumber dll ...
Mohammad Moghimi

Jawaban:

8

Tidak terlalu sulit untuk menulis sesuatu untuk melakukan pekerjaan itu. Berikut ini contoh skrip Perl (memerlukan modul Archive :: 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);

Jika Anda menginginkan arsip tar.gz / tar.bz2 / tar.xz, tambahkan baris archive_write_add_filter_gzip($out);atau archive_write_add_filter_bzip2($out);atau archive_tar_add_filter_xz($out);setelah archive_write_set_formatbaris.

Ini tidak menggunakan ruang disk sementara (hanya ruang untuk file tar output) dan RAM sangat sedikit (hanya beberapa MB untuk perl, tetapi ia bekerja dengan file satu blok pada suatu waktu, jadi itu tidak masalah jika file Anda lebih besar dari RAM Anda).

hobbs
sumber
15

.7zarsip adalah arsip yang sering dikompres dengan beberapa jenis algoritma, sedangkan .tararsip hanya arsip.

Mereka berbeda dalam ruang lingkup mereka, dan dalam kebanyakan kasus konversi akan memerlukan dekompresi opsional selalu diikuti oleh ekstraksi arsip sumber. Sekalipun .7zarsip tidak akan menggunakan kompresi apa pun, masih membutuhkan ekstraksi.

Yang sedang berkata, Jika Anda bermaksud [mendekompresi] / mengekstrak / mengarsip ulang arsip sumber sekaligus, jawabannya adalah Anda tidak bisa, setidaknya tidak menggunakan alat default Ubuntu karena tartidak dapat membaca daristdin , sehingga Anda tidak dapat mengirim pipa 7zdan tar. Pokoknya sangat mudah untuk mengotomatisasi semuanya dalam satu perintah:

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

* <path_to_archive> = path ke .7zarsip sumber

Juga waktu yang diperlukan untuk file arsip sumber untuk ditulis ke disk dan untuk file yang diekstraksi untuk dibaca untuk [mendekompresi] / mengekstrak / mengarsip ulang arsip sumber dalam dua langkah adalah hambatan untuk seluruh tugas sebagian besar (walaupun tidak hanya) karena potensi rendahnya kecepatan I / O disk, sehingga solusi parsial adalah dengan menyimpan file sementara ke ramdisk untuk hampir membatalkan keseluruhan bottleneck:

  1. Buat titik mount untuk sistem file ramdisk: sudo mkdir /mnt/tmpfs
  2. Pasang sistem file ramdisk: sudo mount -t tmpfs -o size=<tmpfs_size> tmpfs /mnt/ramdisk* <tmpfs_size> = ukuran sistem file dalam byte * 10 3 (1, 1K, 1M, 1G, ...)
  3. Jalankan 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> = path ke .7zarsip sumber
  4. Lepaskan sistem file ramdisk: sudo umount
  5. Hapus titik mount untuk sistem file ramdisk: sudo rmdir /mnt/tmpfs
kos
sumber
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Mitch