是否可以将7z直接转换为tar?


10

我有一个.zz文件,其中包含多个目录中的〜360,000张图片。我想将其转换为.tar,以便可以在另一台计算机上打开它。有比将其提取到文件并再次压缩更好的方法吗?是否可以直接进行转换?


8
是什么导致您无法.7z在另一台计算机上打开文件?
约旦

我在安装7z的目标位置没有管理员权限。我知道我可以从源代码安装...
Mohammad Moghimi 2015年

Answers:


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文件的空间)和很小的RAM(对于perl来说只有几个MB,但它一次可以处理一个文件,因此如果文件较大,这不是问题。比您的RAM)。


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档案的路径

同样,将源归档文件的文件写入磁盘和读取提取的文件以分两步对[源文件]进行[解压缩] /提取/重新归档所需的时间主要是整个任务的瓶颈(尽管并非如此)仅),因为潜在磁盘的I / O速度较低,因此,部分解决方案是将临时文件存储到ramdisk中,以使总体瓶颈几乎消失:

  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

评论不作进一步讨论;此对话已转移至聊天
米奇
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.