7z를 tar로 직접 변환 할 수 있습니까?


10

여러 디렉토리에 ~ 360,000 개의 이미지가 포함 된 .7z 파일이 있습니다. 다른 컴퓨터에서 열 수 있도록 .tar로 변환하고 싶습니다. 파일로 압축을 풀고 다시 압축하는 것보다 더 좋은 방법이 있습니까? 직접 변환 할 수 있습니까?


8
.7z다른 컴퓨터 에서 파일을 열 수없는 이유는 무엇입니까 ?
Jordan

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 파일을위한 공간)과 매우 작은 RAM (perl을 위해 단지 몇 MB)을 사용하지 않지만 한 번에 한 블록 씩 파일과 함께 작동하므로 파일이 더 큰 경우 문제가되지 않습니다 RAM보다).


15

.7z아카이브는 종종 일종의 알고리즘으로 압축 된 아카이브이며, .tar아카이브는 단지 아카이브입니다.

그것들의 범위는 다르며, 대부분의 경우 변환은 선택적 압축 해제가 필요하며 항상 소스 아카이브의 추출이 필요합니다. 하더라도 .7z아카이브은 압축을 사용하지 않을 여전히 추출을 필요로한다.

즉, 소스 아카이브를 한 번에 [압축 풀기] / 추출 / 다시 아카이브하려는 경우, 적어도 Ubuntu의 기본 도구를 tar사용할 수 없으므로 읽을stdin 수 없으므로 파이프 7ztar. 어쨌든 하나의 명령으로 모든 것을 자동화하는 것은 매우 쉽습니다.

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

* <path_to_archive> = 소스 .7z아카이브 경로

또한 소스 아카이브의 파일에 필요한 시간 압축이 풀린 파일을 디스크에 및을 위해 쓸 수는 [압축 해제]로 순서대로 읽을 수 / 추출 / 두 단계의 소스 아카이브 전체 작업의 병목 다시 아카이브 주로 입력해도 (안 유일한) 잠재적 디스크의 I / O 속도가 느리기 때문에 부분적인 해결책은 전체 병목 현상을 거의 무효화하기 위해 임시 파일을 램 디스크에 저장하는 것입니다.

  1. 램 디스크 파일 시스템의 마운트 지점을 만듭니다 : 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. 램 디스크 파일 시스템의 마운트 포인트를 제거하십시오 : sudo rmdir /mnt/tmpfs

의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
Mitch
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.