複数のディレクトリに〜360,000画像を含む.7zファイルがあります。別のコンピューターで開くことができるように、.tarに変換したいのですが。ファイルに抽出して再度圧縮するよりも良い方法はありますか?直接変換することは可能ですか?
複数のディレクトリに〜360,000画像を含む.7zファイルがあります。別のコンピューターで開くことができるように、.tarに変換したいのですが。ファイルに抽出して再度圧縮するよりも良い方法はありますか?直接変換することは可能ですか?
回答:
仕事をするために何かを書くことはそれほど難しくありません。以下は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よりも)。
.7z
アーカイブは、多くの場合、何らかのアルゴリズムで圧縮された.tar
アーカイブですが、アーカイブは単なるアーカイブです。
それらはスコープが異なり、ほとんどの場合、変換にはオプションの解凍が必要で、常にソースアーカイブの抽出が続きます。場合でも、.7z
アーカイブは任意の圧縮を使用することはありません、それはまだ抽出を必要とします。
あなたは[解凍] /抽出物に意図した場合ということでは、言った/一度ソースアーカイブを再アーカイブ、答えはので、あなたは、少なくとも、Ubuntuのデフォルトのツールを使用していないことができないですtar
から読み取ることができませんstdin
ので、あなたが配管できない、7z
とtar
。とにかく、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ディスクに格納して、全体的なボトルネックをほぼ解消することです。
sudo mkdir /mnt/tmpfs
sudo mount -t tmpfs -o size=<tmpfs_size> tmpfs /mnt/ramdisk
* <tmpfs_size> =ファイルシステムのサイズ(バイト単位)* 10 3(1、1K 、1M、1G、...)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
アーカイブへのパスsudo umount
sudo rmdir /mnt/tmpfs
.7z
別のコンピューターでファイルを開けない原因は何ですか?