En azından dosya adlarının sabit boyutlu (100 bayt) bir alanda depolandığı eski stil formatıyla uyumlu arşivler için çok zor olmamalı, ancak yeniden adlandırabilecek herhangi bir araç bilmiyorum tar arşivinde yer alan dosya. Ayrıca, sıkıştırılmış bir arşivle, yine de yeni bir dosya oluşturmanız gerekir.
Daha da kolay olmalı, ancak bir arşivi filtreleyebilecek, mevcut dosyaları yeniden adlandıran mevcut bir araç bilmiyorum. Komut dosyası dillerinde tar kitaplıklarının üzerine bir tane oluşturabilirsiniz; örneğin, burada Perl ileArchive::Tar
bir tar arşivindeki bir dizini yeniden adlandırmak için bir kavram kanıtı komut dosyası . Arşiv tamamen belleğe yüklenir; bu özünde bir sınırlamadır 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, üyeleri anında yeniden adlandırma yeteneğine sahip değildir, ancak pax
(POSIX'in cpio
ve yerine tar
). Ancak, pax
bir arşivden hem okuma hem de yazma yapamazsınız . Yapabileceğiniz şey, arşivi AVFS aracılığıyla normal bir ağaç olarak göstermek ve ile yeni bir arşiv oluşturmaktır pax
. Bu, dosya adlarını (dönüştürülmüş olanlar hariç), içerikleri, saatleri ve modları korur, ancak dosya sahipliğini sizin için sıfırlar (kök olarak yürütülmedikçe).
mountavfs
cd "~/.avfs$PWD/old.tgz#"
pax -w -s '!bar!baz!' -s '!bar/!baz/' . | gzip >new.tgz