È possibile convertire 7z in tar direttamente?


10

Ho un file .7z contenente ~ 360.000 immagini in più directory. Vorrei convertirlo in un .tar in modo da poterlo aprire in un altro computer. C'è un modo migliore di estrarlo in file e comprimerlo di nuovo? È possibile effettuare direttamente la conversione?


8
Cosa ti impedisce di aprire il .7zfile su un altro computer?
Giordania,

Non ho i diritti di amministratore sulla destinazione per installare 7z. So che posso installare da sorgenti ecc ...
Mohammad Moghimi,

Risposte:


8

Non è troppo difficile scrivere qualcosa per fare il lavoro. Ecco un esempio di script Perl (richiede il modulo 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);

Se si desidera un archivio tar.gz / tar.bz2 / tar.xz, aggiungere la riga archive_write_add_filter_gzip($out);o archive_write_add_filter_bzip2($out);oppure archive_tar_add_filter_xz($out);dopo la archive_write_set_formatriga.

Questo non utilizza spazio su disco temporaneo (solo lo spazio per il file tar di output) e pochissima RAM (solo pochi MB per perl, ma funziona con i file un blocco alla volta, quindi non è un problema se i tuoi file sono più grandi della tua RAM).


15

.7zgli archivi sono archivi spesso compressi con un qualche tipo di algoritmo, mentre gli .tararchivi sono solo archivi.

Differiscono nel loro ambito di applicazione e nella maggior parte dei casi una conversione richiederebbe una decompressione facoltativa sempre seguita da un'estrazione dell'archivio di origine. Anche se un .7zarchivio non usasse alcuna compressione, richiederebbe comunque un'estrazione.

Detto questo, se intendevi [decomprimere] / estrarre / cercare nuovamente l'archivio sorgente in una sola volta, la risposta è che non puoi, almeno non usare gli strumenti predefiniti di Ubuntu perché tarnon puoi leggere dastdin , quindi non puoi reindirizzare 7ze tar. Ad ogni modo è molto facile automatizzare tutto in un solo comando:

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

* <path_to_archive> = percorso .7zall'archivio di origine

Anche il tempo necessario per i file dell'archivio sorgente da scrivere sul disco e per i file estratti da leggere al fine di [decomprimere] / estrarre / rearchive l'archivio di origine in due fasi è un collo di bottiglia per l'intera operazione per lo più (benche non solo) a causa della bassa velocità I / O di un potenziale disco, quindi una soluzione parziale sarebbe quella di archiviare i file temporanei in un ramdisk per annullare quasi il collo di bottiglia complessivo:

  1. Crea il mount point per il filesystem del ramdisk: sudo mkdir /mnt/tmpfs
  2. Montare il filesystem del ramdisk: sudo mount -t tmpfs -o size=<tmpfs_size> tmpfs /mnt/ramdisk* <tmpfs_size> = dimensione del filesystem in byte * 10 3 (1, 1K, 1M, 1G, ...)
  3. Esegui 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> = percorso .7zdell'archivio di origine
  4. Smonta il filesystem del ramdisk: sudo umount
  5. Rimuovi il mount point per il filesystem del ramdisk: sudo rmdir /mnt/tmpfs

I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat .
Mitch
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.