Це не повинно бути дуже складно, принаймні для архівів, сумісних із старим форматом, де імена файлів зберігаються у полі фіксованого розміру (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