Это не должно быть очень сложно, по крайней мере для архивов, которые совместимы с форматом старого стиля, где имена файлов хранятся в поле фиксированного размера (100 байт), но я не знаю ни одного инструмента, который может переименовать файл на месте в архиве tar. Кроме того, со сжатым архивом вам все равно нужно будет создать новый файл.
Это должно быть еще проще, но я не знаю ни одного существующего инструмента, который может фильтровать архив, переименовывая файлы по мере необходимости. Вы можете создать один поверх библиотек tar на языках сценариев; например, вот сценарий проверки концепции для переименования каталога в архиве tar с использованием PerlArchive::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