Чи можна конвертувати 7z в тар безпосередньо?


10

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


8
Що заважає вам відкривати .7zфайл на іншому комп'ютері?
Йорданія

У мене немає прав адміністратора за призначенням для встановлення 7z. Я знаю, що можу встановити з джерела тощо ...
Mohammad Moghimi

Відповіді:


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, але він працює з файлами блок одночасно, тому це не проблема, якщо ваші файли більше ніж ваша оперативна пам’ять).


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архіву

Також час, необхідний для запису файлів архіву джерела на диск та для зчитування витягнутих файлів, щоб [декомпресувати] / витягнути / перезавантажити вихідний архів у два етапи - це вузьке місце для всього завдання здебільшого (хоч і не лише) через низьку швидкість вводу / виводу потенційного диска, тому частковим рішенням буде збереження тимчасових файлів у рамковий диск, щоб майже анулювати загальне вузьке місце:

  1. Створіть точку монтування для файлової системи ramdisk: sudo mkdir /mnt/tmpfs
  2. Встановіть файлову систему ramdisk: 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. Відключіть файлову систему ramdisk: sudo umount
  5. Видаліть точку монтування файлової системи ramdisk: sudo rmdir /mnt/tmpfs

Коментарі не для розширеного обговорення; ця розмова була переміщена до чату .
Мітч
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.