Czy można bezpośrednio przekonwertować 7z na tar?

10

Mam plik .7z zawierający ~ 360 000 obrazów w wielu katalogach. Chciałbym przekonwertować go na plik .tar, aby móc go otworzyć na innym komputerze. Czy istnieje lepszy sposób niż wypakowanie go do plików i ponowne ich skompresowanie? Czy można dokonać bezpośredniej konwersji?

Mohammad Moghimi
źródło
8
Co uniemożliwia otwarcie .7zpliku na innym komputerze?
Jordan
Nie mam uprawnień administratora w miejscu docelowym, aby zainstalować 7z. Wiem, że mogę zainstalować ze źródła itp.
Mohammad Moghimi,

Odpowiedzi:

8

Nie jest zbyt trudno napisać coś do roboty. Oto przykładowy skrypt Perla (wymaga modułu 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);

Jeśli chciałeś tar.gz / tar.bz2 / tar.xz archiwum, należy dodać linię archive_write_add_filter_gzip($out);lub archive_write_add_filter_bzip2($out);czy archive_tar_add_filter_xz($out);po archive_write_set_formatlinii.

To nie używa tymczasowego miejsca na dysku (tylko miejsce na wyjściowy plik tar) i bardzo mało pamięci RAM (tylko kilka MB dla perla, ale działa z plikami blok na raz, więc nie jest problemem, jeśli twoje pliki są większe niż pamięć RAM).

Hobbs
źródło
15

.7zarchiwa to archiwa często skompresowane przy użyciu pewnego rodzaju algorytmu, podczas gdy .tararchiwa to tylko archiwa.

Różnią się one zakresem, aw większości przypadków konwersja wymagałaby opcjonalnej dekompresji, po której zawsze następuje ekstrakcja archiwum źródłowego. Nawet jeśli .7zarchiwum nie użyłoby żadnej kompresji, nadal wymagałoby wyodrębnienia.

Biorąc to pod uwagę, jeśli chciałeś [zdekompresować] / wyodrębnić / ponownie zarchiwizować archiwum źródłowe, odpowiedź brzmi: nie możesz, przynajmniej nie używając domyślnych narzędzi Ubuntu, ponieważ tarnie możesz czytaćstdin , więc nie możesz potokować 7zi tar. W każdym razie bardzo łatwo jest zautomatyzować wszystko za pomocą jednego polecenia:

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

* <ścieżka_do_archiwum> = ścieżka do .7zarchiwum źródłowego

Również czas wymagany dla plików archiwum źródłowego mają być zapisane na dysku i dla wyodrębnionych plików do odczytu, aby [dekompresji] / wyciąg / rearchive archiwum źródło w dwóch etapach jest wąskim gardłem dla całego zadania głównie (altough nie tylko) z powodu niskiej prędkości we / wy potencjalnego dysku, więc częściowym rozwiązaniem byłoby przechowywanie plików tymczasowych na ramdysku w celu prawie całkowitego zlikwidowania wąskiego gardła:

  1. Utwórz punkt montowania dla systemu plików ramdysku: sudo mkdir /mnt/tmpfs
  2. Zamontuj system plików ramdysku: sudo mount -t tmpfs -o size=<tmpfs_size> tmpfs /mnt/ramdisk* <tmpfs_size> = rozmiar systemu plików w bajtach * 10 3 (1, 1K, 1M, 1G, ...)
  3. Uruchom 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* <ścieżka_do_archiwum> = ścieżka do .7zarchiwum źródłowego
  4. Odmontuj system plików ramdysku: sudo umount
  5. Usuń punkt montowania systemu plików ramdysku: sudo rmdir /mnt/tmpfs
kos
źródło
Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
Mitch