여러 디렉토리에 ~ 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);
당신은 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보다).
.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 속도가 느리기 때문에 부분적인 해결책은 전체 병목 현상을 거의 무효화하기 위해 임시 파일을 램 디스크에 저장하는 것입니다.
sudo mkdir /mnt/tmpfssudo 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 umountsudo rmdir /mnt/tmpfs
.7z다른 컴퓨터 에서 파일을 열 수없는 이유는 무엇입니까 ?