Ist es möglich, 7z direkt in Teer umzuwandeln?

10

Ich habe eine .7z-Datei mit ~ 360.000 Bildern in mehreren Verzeichnissen. Ich möchte es in eine .tar-Datei konvertieren, damit ich es auf einem anderen Computer öffnen kann. Gibt es eine bessere Möglichkeit, als es in Dateien zu extrahieren und erneut zu komprimieren? Ist die Konvertierung direkt möglich?

Mohammad Moghimi
quelle
8
Was hindert Sie daran, die .7zDatei auf einem anderen Computer zu öffnen ?
Jordanien
Ich habe keine Administratorrechte für das Ziel, um 7z zu installieren. Ich weiß, dass ich von der Quelle usw. installieren kann ...
Mohammad Moghimi

Antworten:

8

Es ist nicht allzu schwer, etwas zu schreiben, um die Arbeit zu erledigen. Hier ist ein Beispiel für ein Perl-Skript (erfordert das 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);

Wenn Sie ein Archiv tar.gz / tar.bz2 / tar.xz möchten, fügen Sie die Zeile archive_write_add_filter_gzip($out);oder archive_write_add_filter_bzip2($out);oder archive_tar_add_filter_xz($out);nach der archive_write_set_formatZeile hinzu.

Dies verwendet keinen temporären Speicherplatz (nur den Speicherplatz für die Ausgabe-TAR-Datei) und sehr wenig RAM (nur ein paar MB für Perl, aber es funktioniert blockweise mit den Dateien, sodass es kein Problem ist, wenn Ihre Dateien größer sind als Ihr RAM).

Hobbs
quelle
15

.7zArchive sind Archive, die häufig mit einem Algorithmus komprimiert werden, während .tarArchive nur Archive sind.

Sie unterscheiden sich in ihrem Umfang, und in den meisten Fällen würde eine Konvertierung eine optionale Dekomprimierung erfordern, gefolgt von einer Extraktion des Quellarchivs. Selbst wenn ein .7zArchiv keine Komprimierung verwenden würde, wäre dennoch eine Extraktion erforderlich.

Davon abgesehen: Wenn Sie das Quellarchiv auf einmal [dekomprimieren] / extrahieren / durchsuchen wollten, ist die Antwort, dass Sie es nicht können, zumindest nicht die Standardtools von Ubuntu, weil Sie tarnicht lesen könnenstdin , also können Sie nicht 7zund weiterleiten tar. Auf jeden Fall ist es sehr einfach, alles in einem einzigen Befehl zu automatisieren:

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

* <Path_to_archive> = Pfad zum .7zQuellarchiv

Auch die Zeit, die erforderlich ist, um die Dateien des Quellarchivs auf die Festplatte zu schreiben und die extrahierten Dateien zu lesen, um das Quellarchiv in zwei Schritten [zu dekomprimieren] / zu extrahieren / zu durchsuchen, ist meistens ein Engpass für die gesamte Aufgabe (obwohl dies nicht der Fall ist) Nur) Aufgrund der geringen E / A-Geschwindigkeit einer potenziellen Festplatte besteht eine Teillösung darin, die temporären Dateien auf einer Ramdisk zu speichern, um den gesamten Engpass fast zu beseitigen:

  1. Erstellen Sie den Einhängepunkt für das Dateisystem der Ramdisk: sudo mkdir /mnt/tmpfs
  2. Hängen Sie das Dateisystem der Ramdisk ein: sudo mount -t tmpfs -o size=<tmpfs_size> tmpfs /mnt/ramdisk* <tmpfs_size> = Größe des Dateisystems in Bytes * 10 3 (1, 1K, 1M, 1G, ...)
  3. Führen Sie 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> = Pfad zum .7zQuellarchiv
  4. Hängen Sie das Dateisystem der Ramdisk aus: sudo umount
  5. Entfernen Sie den Einhängepunkt für das Dateisystem der Ramdisk: sudo rmdir /mnt/tmpfs
kos
quelle
Kommentare sind nicht für eine ausführliche Diskussion gedacht. Dieses Gespräch wurde in den Chat verschoben .
Mitch