적어도 파일 이름이 고정 크기 (100 바이트) 필드에 저장되는 구식 형식과 호환되는 아카이브의 경우 매우 어려워서는 안되지만 이름을 바꿀 수있는 도구는 알 수 없습니다. tar 아카이브에 파일을 넣습니다. 또한 압축 된 아카이브를 사용하면 새 파일을 만들어야합니다.
훨씬 쉬워야하지만 아카이브를 필터링하고 파일 이름을 바꿀 수있는 기존 도구는 알지 못합니다. 스크립트 언어로 tar 라이브러리 위에 하나를 작성할 수 있습니다. 예를 들어, Perl과 함께Archive::Tar
tar 아카이브의 디렉토리 이름을 바꾸는 개념 증명 스크립트 가 있습니다. 아카이브는 완전히 메모리에로드됩니다. 이것은의 본질적인 한계입니다 Archive::Tar
.
#!/usr/bin/env perl
## Usage: tar-rename OLDPREFIX NEWPREFIX
use strict;
use warnings;
use Archive::Tar;
my ($from, $to) = @ARGV;
my $tar = Archive::Tar->new(\*STDIN);
foreach my $file ($tar->get_files()) {
my $name = $file->name;
$name =~ s~\A\Q$from\E($|/)~$to$1~;
$file->rename($name) unless $name eq $file->name;
}
$tar->write(\*STDOUT);
GNU tar는 즉석에서 멤버의 이름을 바꾸는 기능이 없지만 pax
(POSIX 대신 cpio
및 tar
)는 그렇게합니다. 그러나 pax
아카이브에서 읽고 쓸 수는 없습니다 . AVFS를 통해 아카이브를 일반 트리로 표시 하고을 사용하여 새 아카이브를 생성하면됩니다 pax
. 파일 이름 (변환 된 것 제외), 내용, 시간 및 모드는 유지되지만 파일 소유권은 사용자에게 재설정됩니다 (루트로 실행되지 않은 경우).
mountavfs
cd "~/.avfs$PWD/old.tgz#"
pax -w -s '!bar!baz!' -s '!bar/!baz/' . | gzip >new.tgz