是否可以重命名 tar 存档内的目录?我的用例是我有一个外部提供的 RPM 规范文件,它假定一个具有特定目录结构的 tarball,并且我有一个外部提供的 tarball,其顶级目录名称与规范文件所期望的不匹配。我不控制生成 tarball 的脚本或 RPM 规范文件,因此我无法更改其中任何一个以匹配另一个。
我一直在做的是解压缩,更改目录名称,然后创建一个新的 tarball,但我想知道是否有替代方法。
Gil*_*il' 12
这应该不是很困难,至少对于与旧式格式兼容的档案,其中文件名存储在固定大小(100 字节)字段中,但我不知道有任何工具可以重命名tar 存档中的文件。此外,对于压缩存档,您无论如何都需要创建一个新文件。
它应该更容易,但我不知道任何现有的工具可以过滤存档,并在进行时重命名文件。您可以在脚本语言的 tar 库之上构建一个;例如,这是一个概念验证脚本,用于使用Perl 和Archive::Tar
.tar 重命名 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);
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)