7zを直接tarに変換することは可能ですか?


10

複数のディレクトリに〜360,000画像を含む.7zファイルがあります。別のコンピューターで開くことができるように、.tarに変換したいのですが。ファイルに抽出して再度圧縮するよりも良い方法はありますか?直接変換することは可能ですか?


8
.7z別のコンピューターでファイルを開けない原因は何ですか?
ヨルダン

7zをインストールする宛先の管理者権限がありません。私はソースなどからインストールできることを知っています...
Mohammad Moghimi 2015

回答:


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);

あなたはAの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ファイル用の領域のみ)、RAMはごくわずか(perlの場合は数MB)ですが、一度に1ブロックずつファイルで機能するため、ファイルが大きい場合は問題ありません。あなたのRAMよりも)。


15

.7zアーカイブは、多くの場合、何らかのアルゴリズムで圧縮された.tarアーカイブですが、アーカイブは単なるアーカイブです。

それらはスコープが異なり、ほとんどの場合、変換にはオプションの解凍が必要で、常にソースアーカイブの抽出が続きます。場合でも、.7zアーカイブは任意の圧縮を使用することはありません、それはまだ抽出を必要とします。

あなたは[解凍] /抽出物に意図した場合ということでは、言った/一度ソースアーカイブを再アーカイブ、答えはので、あなたは、少なくとも、Ubuntuのデフォルトのツールを使用していないことができないですtarから読み取ることができませんstdinので、あなたが配管できない、7ztar。とにかく、1つのコマンドですべてを自動化するのは非常に簡単です。

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

* <path_to_archive> =ソース.7zアーカイブへのパス

また、ソースアーカイブのファイルがディスクに書き込まれ、抽出されたファイルが2つのステップで[解凍] /抽出/再アーカイブするために読み込まれるのに必要な時間は、ほとんどの場合、タスク全体のボトルネックになります(ただし、のみ)潜在的なディスクのI / O速度が遅いため、部分的な解決策は、一時ファイルをRAMディスクに格納して、全体的なボトルネックをほぼ解消することです。

  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

コメントは詳細な議論のためのものではありません。この会話はチャットに移動しました
ミッチ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.