Це не повинно бути дуже складно, принаймні для архівів, сумісних із старим форматом, де імена файлів зберігаються у полі фіксованого розміру (100 байт), але я не знаю жодного інструменту, який може перейменувати файл на місці в архіві смоли. Крім того, зі стиснутим архівом вам все одно потрібно буде створити новий файл.
Це може бути ще простіше, але я не знаю жодного існуючого інструменту, який би міг фільтрувати архів, перейменувавши файли, як йде. Ви можете побудувати його поверх бібліотек tar на мовах скриптів; наприклад, ось сценарій перевірки концепції перейменування каталогу в архіві tar, використовуючи Perl зArchive::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. Це зберігає назви файлів (крім трансформованих), вмісту, часу та режимів, але скидає право власності на файл (якщо не виконується як root).
mountavfs
cd "~/.avfs$PWD/old.tgz#"
pax -w -s '!bar!baz!' -s '!bar/!baz/' . | gzip >new.tgz