少なくとも、ファイル名が固定サイズ(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
and の代替tar
)にはあります。ただし、pax
アーカイブから読み取りと書き込みの両方を行うことはできません。あなたができることはAVFSを通してアーカイブを通常のツリーとして公開して、で新しいアーカイブを作成することですpax
。これにより、ファイル名(変換されたものを除く)、内容、時間、モードは保持されますが、ファイルの所有権は(rootとして実行されない限り)リセットされます。
mountavfs
cd "~/.avfs$PWD/old.tgz#"
pax -w -s '!bar!baz!' -s '!bar/!baz/' . | gzip >new.tgz