Можно ли напрямую конвертировать 7z в tar?

10

У меня есть файл .7z, содержащий ~ 360 000 изображений в нескольких каталогах. Я хотел бы преобразовать его в .tar, чтобы открыть его на другом компьютере. Есть ли лучший способ, чем распаковывать его в файлы и снова сжимать? Можно ли сделать преобразование напрямую?

Мохаммад Могими
источник
8
Что мешает вам открыть .7zфайл на другом компьютере?
Иордания
У меня нет прав администратора в пункте назначения для установки 7z. Я знаю, что могу установить из исходников и т. Д.
Мохаммад Могими

Ответы:

8

Это не так сложно написать что-то, чтобы сделать работу. Вот пример сценария Perl (требуется модуль 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);

Если вы хотели tar.gz / tar.bz2 / tar.xz архив, добавить строку archive_write_add_filter_gzip($out);или archive_write_add_filter_bzip2($out);или archive_tar_add_filter_xz($out);после archive_write_set_formatлинии.

При этом не используется временное дисковое пространство (только место для выходного tar-файла) и очень мало оперативной памяти (всего несколько МБ для perl, но он работает с файлами по одному блоку за раз, поэтому если ваши файлы больше, то это не проблема) чем ваша RAM).

Hobbs
источник
15

.7zархивы - это архивы, которые часто сжимаются по какому-то алгоритму, а .tarархивы - это просто архивы.

Они различаются по своему объему, и в большинстве случаев преобразование потребует необязательной распаковки, за которой всегда следует извлечение исходного архива. Даже если .7zархив не использует сжатие, он все равно потребует извлечения.

При этом, если вы намеревались [распаковать] / извлечь / переархивировать исходный архив сразу, ответ таков: вы не можете, по крайней мере, не использовать стандартные инструменты Ubuntu, потому что tarне можете читатьstdin , поэтому вы не можете передавать 7zи tar, В любом случае, все очень просто автоматизировать одной командой:

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

* <path_to_archive> = путь к исходному .7zархиву

Кроме того , время , необходимое для файлов исходного архива, чтобы записать на диск и для извлечения файлов для чтения, чтобы [декомпрессия] / выписка / rearchive архив источника в два этапа является узким местом для всей задачи в основном (Altough не только) из-за низкой скорости ввода-вывода потенциального диска, поэтому частичным решением было бы сохранить временные файлы на виртуальном диске для того, чтобы почти устранить общее узкое место:

  1. Создайте точку монтирования для файловой системы ramdisk: sudo mkdir /mnt/tmpfs
  2. Смонтируйте файловую систему виртуального диска : sudo mount -t tmpfs -o size=<tmpfs_size> tmpfs /mnt/ramdisk* <tmpfs_size> = размер файловой системы в байтах * 10 3 (1, 1K, 1M, 1G, ...)
  3. Выполнить 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> = путь к исходному .7zархиву
  4. Размонтируйте файловую систему виртуального диска: sudo umount
  5. Удалите точку монтирования для файловой системы ramdisk: sudo rmdir /mnt/tmpfs
кос
источник
Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат .
Митч