重命名tar归档文件中的目录

洛林·霍希斯坦(Lorin Hochstein)

是否可以在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替代cpiotar)可以。但是,您不能pax同时从存档中进行读取和写入。您可以做的是通过AVFS将档案公开为常规树,并使用创建新档案pax这将保留文件名(转换后的文件除外),内容,时间和模式,但会向您重置文件所有权(除非以root身份执行)。

mountavfs
cd "~/.avfs$PWD/old.tgz#"
pax -w -s '!bar!baz!' -s '!bar/!baz/' . | gzip >new.tgz

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章