Não deve ser muito difícil, pelo menos para arquivos compatíveis com o formato antigo, onde os nomes dos arquivos são armazenados em um campo de tamanho fixo (100 bytes), mas não conheço nenhuma ferramenta que possa renomear um arquivo. arquivo em um arquivo tar. Além disso, com um arquivo compactado, você precisará criar um novo arquivo de qualquer maneira.
Deve ser ainda mais fácil, mas não conheço nenhuma ferramenta existente que possa filtrar um arquivo morto, renomeando arquivos à medida que for sendo processada. Você pode criar uma sobre as bibliotecas tar nas linguagens de script; por exemplo, aqui está um script de prova de conceito para renomear um diretório em um arquivo tar usando o PerlArchive::Tar
. O arquivo é carregado inteiramente na memória; essa é uma limitação intrínseca de 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);
O tar do GNU não tem a capacidade de renomear membros rapidamente, mas pax
(o substituto do POSIX para cpio
e tar
) possui. No entanto, você não pode fazer pax
a leitura e gravação de um arquivo. O que você pode fazer é expor o arquivo morto como uma árvore comum por meio do AVFS e criar um novo arquivo mortopax
. Isso mantém os nomes dos arquivos (exceto quando transformados), o conteúdo, os horários e os modos, mas redefine a propriedade do arquivo para você (a menos que seja executado como root).
mountavfs
cd "~/.avfs$PWD/old.tgz#"
pax -w -s '!bar!baz!' -s '!bar/!baz/' . | gzip >new.tgz