是否可以在tar归档文件中重命名目录?我的用例是,我有一个外部提供的RPM规范文件,该文件假定一个具有特定目录结构的tarball,并且我有一个外部提供的tarball,其顶级目录名称与该规范文件期望的名称不匹配。我既不控制生成tarball的脚本,也不控制RPM规范文件,因此我无法更改其中任何一个以匹配另一个。
我一直在做的事情是解压缩,更改目录名称,然后创建一个新的tarball,但是我想知道是否还有替代方法。
这应该不是很困难,至少对于与旧格式兼容的档案而言,文件名存储在固定大小(100字节)字段中,但是我不知道有什么工具可以重命名文件放在tar存档中。此外,对于压缩的存档,您仍然需要创建一个新文件。
它应该甚至更容易,但是我不知道任何现有的工具都可以过滤存档,并在重命名文件时对其进行重命名。您可以使用脚本语言在tar库的顶部构建一个库。例如,这是一个概念证明脚本,该脚本使用PerlArchive::Tar
使用Perl重命名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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句