Est-il possible de convertir 7z en tar directement?

10

J'ai un fichier .7z contenant ~ 360 000 images dans plusieurs répertoires. Je voudrais le convertir en .tar afin de pouvoir l'ouvrir sur un autre ordinateur. Existe-t-il un meilleur moyen que de l'extraire dans des fichiers et de les compresser à nouveau? Est-il possible de faire la conversion directement?

Mohammad Moghimi
la source
8
Qu'est-ce qui vous empêche d'ouvrir le .7zfichier sur un autre ordinateur?
Jordan
Je n'ai pas de droits d'administrateur sur la destination pour installer 7z. Je sais que je peux installer à partir des sources etc ...
Mohammad Moghimi

Réponses:

8

Ce n'est pas trop difficile d'écrire quelque chose pour faire le travail. Voici un exemple de script Perl (nécessite le module 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 vous vouliez une archive tar.gz / tar.bz2 / tar.xz, ajoutez la ligne archive_write_add_filter_gzip($out);ou archive_write_add_filter_bzip2($out);ou archive_tar_add_filter_xz($out);après la archive_write_set_formatligne.

Cela n'utilise pas d'espace disque temporaire (juste l'espace pour le fichier tar de sortie) et très peu de RAM (juste quelques Mo pour perl, mais cela fonctionne avec les fichiers un bloc à la fois, donc ce n'est pas un problème si vos fichiers sont plus gros que votre RAM).

Hobbs
la source
15

.7zles archives sont des archives souvent compressées avec une sorte d'algorithme, tandis que les .tararchives ne sont que des archives.

Ils diffèrent par leur portée, et dans la plupart des cas, une conversion nécessiterait une décompression facultative toujours suivie d'une extraction de l'archive source. Même si une .7zarchive n'utilisait aucune compression, elle nécessiterait toujours une extraction.

Cela étant dit, si vous vouliez [décompresser] / extraire / rechercher à nouveau l'archive source à la fois, la réponse est que vous ne pouvez pas, du moins ne pas utiliser les outils par défaut d'Ubuntu car tarvous ne pouvez pas lirestdin , vous ne pouvez donc pas diriger 7zet tar. Quoi qu'il en soit, il est très facile d'automatiser tout en une seule commande:

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

* <path_to_archive> = chemin vers l' .7zarchive source

De plus, le temps nécessaire pour que les fichiers de l'archive source soient écrits sur le disque et pour que les fichiers extraits soient lus afin de [décompresser] / extraire / rechercher à nouveau l'archive source en deux étapes est un goulot d'étranglement pour l'ensemble de la tâche principalement (mais pas uniquement) en raison de la faible vitesse d'E / S d'un disque potentiel, une solution partielle serait donc de stocker les fichiers temporaires sur un disque virtuel afin de presque annuler le goulot d'étranglement global:

  1. Créez le point de montage pour le système de fichiers du disque virtuel: sudo mkdir /mnt/tmpfs
  2. Montez le système de fichiers du ramdisk: sudo mount -t tmpfs -o size=<tmpfs_size> tmpfs /mnt/ramdisk* <tmpfs_size> = taille du système de fichiers en octets * 10 3 (1, 1K, 1M, 1G, ...)
  3. Exécutez 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> = chemin vers l' .7zarchive source
  4. Démontez le système de fichiers du disque virtuel: sudo umount
  5. Supprimez le point de montage du système de fichiers du disque virtuel: sudo rmdir /mnt/tmpfs
kos
la source
Les commentaires ne sont pas pour une discussion approfondie; cette conversation a été déplacée vers le chat .
Mitch