여러 디렉토리에 ~ 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/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
다른 컴퓨터 에서 파일을 열 수없는 이유는 무엇입니까 ?