Không nên quá khó, ít nhất là đối với các tài liệu lưu trữ tương thích với định dạng kiểu cũ, nơi tên tệp được lưu trữ trong trường có kích thước cố định (100 byte), nhưng tôi không biết bất kỳ công cụ nào có thể đổi tên tập tin tại chỗ trong một kho lưu trữ tar. Ngoài ra, với kho lưu trữ nén, bạn vẫn cần tạo một tệp mới.
Nó thậm chí còn dễ dàng hơn, nhưng tôi không biết bất kỳ công cụ hiện có nào có thể lọc một kho lưu trữ, đổi tên các tệp khi nó đi. Bạn có thể xây dựng một trên đầu các thư viện tar trong các ngôn ngữ kịch bản; ví dụ: đây là tập lệnh Proof-of-Concept để đổi tên một thư mục trong kho lưu trữ tar bằng Perl vớiArchive::Tar
. Các kho lưu trữ được tải hoàn toàn vào bộ nhớ; đây là một hạn chế nội tại của 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 không có khả năng đổi tên thành viên một cách nhanh chóng, nhưng pax
(thay thế cho POSIX cho cpio
và tar
) thì có. Tuy nhiên, bạn không thể thực hiện pax
cả đọc và viết từ kho lưu trữ. Những gì bạn có thể làm là hiển thị kho lưu trữ dưới dạng cây thông thường thông qua AVFS và tạo một kho lưu trữ mới với pax
. Điều này giữ lại tên tệp (trừ khi được chuyển đổi), nội dung, thời gian và chế độ nhưng đặt lại quyền sở hữu tệp cho bạn (trừ khi được thực hiện dưới quyền root).
mountavfs
cd "~/.avfs$PWD/old.tgz#"
pax -w -s '!bar!baz!' -s '!bar/!baz/' . | gzip >new.tgz