No debería ser muy difícil, al menos para los archivos que son compatibles con el formato antiguo donde los nombres de archivo se almacenan en un campo de tamaño fijo (100 bytes), pero no conozco ninguna herramienta que pueda cambiar el nombre de un archivo archivo en su lugar en un archivo tar. Además, con un archivo comprimido, necesitaría crear un nuevo archivo de todos modos.
Debería ser aún más fácil, pero no conozco ninguna herramienta existente que pueda filtrar un archivo, renombrar archivos a medida que avanza. Puede construir uno sobre las bibliotecas de tar en lenguajes de script; por ejemplo, aquí hay un script de prueba de concepto para cambiar el nombre de un directorio en un archivo tar usando Perl conArchive::Tar
. El archivo se carga completamente en la memoria; Esta es una limitación 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);
GNU tar no tiene la capacidad de renombrar miembros sobre la marcha, pero pax
(el reemplazo de POSIX para cpio
y tar
) sí. Sin embargo, no puede hacer que pax
tanto leer como escribir desde un archivo. Lo que puede hacer es exponer el archivo como un árbol normal a través de AVFS y crear un nuevo archivo con pax
. Esto retiene los nombres de los archivos (excepto los transformados), los contenidos, los tiempos y los modos, pero restablece la propiedad del archivo (a menos que se ejecute como root).
mountavfs
cd "~/.avfs$PWD/old.tgz#"
pax -w -s '!bar!baz!' -s '!bar/!baz/' . | gzip >new.tgz