¿Es posible convertir 7z a tar directamente?

10

Tengo un archivo .7z que contiene ~ 360,000 imágenes en múltiples directorios. Me gustaría convertirlo en un .tar para poder abrirlo en otra computadora. ¿Hay una mejor manera que extraerlo a los archivos y comprimirlos nuevamente? ¿Es posible hacer la conversión directamente?

Mohammad Moghimi
fuente
8
¿Qué le impide abrir el .7zarchivo en otra computadora?
Jordania
No tengo derechos de administrador en el destino para instalar 7z. Sé que puedo instalar desde la fuente, etc ...
Mohammad Moghimi

Respuestas:

8

No es demasiado difícil escribir algo para hacer el trabajo. Aquí hay un ejemplo de script Perl (requiere el módulo 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);

Si quieres un tar.gz / tar.bz2 / tar.xz archivo, añada la línea archive_write_add_filter_gzip($out);o archive_write_add_filter_bzip2($out);o archive_tar_add_filter_xz($out);después de la archive_write_set_formatlínea.

Esto no utiliza espacio en disco temporal (solo el espacio para el archivo tar de salida) y muy poca RAM (solo unos pocos MB para perl, pero funciona con los archivos un bloque a la vez, por lo que no es un problema si sus archivos son más grandes que tu RAM).

hobbs
fuente
15

.7zlos archivos son a menudo comprimidos con algún tipo de algoritmo, mientras que los .tararchivos son solo archivos.

Difieren en su alcance, y en la mayoría de los casos una conversión requeriría una descompresión opcional siempre seguida de una extracción del archivo fuente. Incluso si un .7zarchivo no utilizara ninguna compresión, aún requeriría una extracción.

Dicho esto, si pretendías [descomprimir] / extraer / volver a archivar el archivo fuente de una vez, la respuesta es que no puedes, al menos no usar las herramientas predeterminadas de Ubuntu porque tarno puedes leerstdin , así que no puedes canalizar 7zy tar. De todos modos, es muy fácil automatizar todo en un solo comando:

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

* <path_to_archive> = ruta al .7zarchivo fuente

Además, el tiempo requerido para que los archivos del archivo fuente se escriban en el disco y para que los archivos extraídos se lean con el fin de [descomprimir] / extraer / volver a archivar el archivo fuente en dos pasos es un cuello de botella para la tarea en su mayoría (aunque no solo) debido a la baja velocidad de E / S de un disco potencial, por lo que una solución parcial sería almacenar los archivos temporales en un disco RAM para casi anular el cuello de botella general:

  1. Cree el punto de montaje para el sistema de archivos de ramdisk: sudo mkdir /mnt/tmpfs
  2. Montar el sistema de archivos del disco ram: sudo mount -t tmpfs -o size=<tmpfs_size> tmpfs /mnt/ramdisk* <tmpfs_size> = tamaño del sistema de archivos en bytes * 10 3 (1, 1K, 1M, 1G, ...)
  3. Ejecute 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> = ruta al .7zarchivo fuente
  4. Desmontar el sistema de archivos del ramdisk: sudo umount
  5. Elimine el punto de montaje para el sistema de archivos de ramdisk: sudo rmdir /mnt/tmpfs
kos
fuente
Los comentarios no son para discusión extendida; Esta conversación se ha movido al chat .
Mitch