Seharusnya tidak terlalu sulit, setidaknya untuk arsip yang kompatibel dengan format gaya lama di mana nama file disimpan dalam bidang ukuran tetap (100 byte), tapi saya tidak tahu alat apa pun yang dapat mengubah nama menjadi file di tempat dalam arsip tar. Selain itu, dengan arsip terkompresi, Anda harus membuat file baru.
Seharusnya lebih mudah, tapi saya tidak tahu ada alat yang bisa menyaring arsip, mengganti nama file saat berjalan. Anda dapat membangun satu di atas pustaka tar dalam bahasa scripting; misalnya, inilah skrip pembuktian konsep untuk mengganti nama direktori dalam arsip tar menggunakan Perl denganArchive::Tar
. Arsip dimuat seluruhnya ke dalam memori; ini adalah batasan intrinsik dari 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 tidak memiliki kemampuan untuk mengganti nama anggota on the fly, tetapi pax
(pengganti POSIX untuk cpio
dan tar
) tidak. Namun, Anda tidak dapat membuat pax
keduanya membaca dan menulis dari arsip. Yang dapat Anda lakukan adalah mengekspos arsip sebagai pohon biasa melalui AVFS , dan membuat arsip baru dengan pax
. Ini mempertahankan nama file (kecuali sebagai ditransformasikan), konten, waktu dan mode tetapi mengatur ulang kepemilikan file kepada Anda (kecuali dieksekusi sebagai root).
mountavfs
cd "~/.avfs$PWD/old.tgz#"
pax -w -s '!bar!baz!' -s '!bar/!baz/' . | gzip >new.tgz