如何在 Unix 中使用 SED 编辑 tar 文件而不解压它们?

问题描述 投票:0回答:2

如何使用 SED 在 Unix 中编辑 tar 文件而不解压它们?

我想更改 .tar 中每个文件以及文件名中可用的时间戳。

sed
2个回答
2
投票

除非您是忍者,否则我认为您需要的不仅仅是 sed。对于初学者来说,您需要做的不仅仅是替换 tar 块标头中的日期,您还需要适当更新标头校验和、标头大小字段,并处理标头规范的所有其他复杂问题。

话虽如此,我建议查看 Perl 的

Archive::Tar::Stream
模块,它可以为您处理以上所有内容:

http://metacpan.org/pod/Archive::Tar::Stream

这是一个示例脚本,它将更新 tar 中所有文件的

mtime
到当前时间,并更改文件名,所有这些都无需解压:

use Archive::Tar::Stream;

my $infile = $ARGV[0];
my $outfile = $ARGV[1];
open( my $infh, "<", $infile );
open( my $outfh, ">", $outfile );
my $ts = Archive::Tar::Stream->new(infh => $infh, outfh => $outfh);

while (my $header = $ts->ReadHeader()) {
        $header->{'mtime'} = time();
        $header->{'name'} = "whatever.txt";
        $ts->WriteHeader($header);
        $ts->CopyBytes($header->{size});
};

0
投票

您可以使用 bsdtar 命令使用

@
语法创建包含现有文件内容的新文件。大多数 Linux 发行版在名为“libarchive”或类似的包中提供 bsdtar。例如:

# Make a file foo, create an original.tar.gz file
# containing it then list its contents
$ echo hello > foo
$ tar czf original.tar.gz foo
$ tar tf original.tar.gz
foo

# We can use bsdtar's -s argument to rewrite paths, but 
# if we give it original.tar.gz as an argument we'll
# just get a tarball-in-a-tarball
$ bsdtar -s '/o/0/g' -c -z -f wrapped.tar.gz original.tar.gz
$ tar tf wrapped.tar.gz
0riginal.tar.gz

# If we instead give it '@original.tar.gz', it will use
# the contents of that archive instead (i.e. foo)
$ bsdtar -s '/o/0/g' -c -z -f unwrapped.tar.gz '@original.tar.gz'
$ tar tf unwrapped.tar.gz
f00

我无法从手册页判断它是否可以修改时间戳(尽管如果需要,它可以排除它们)

© www.soinside.com 2019 - 2024. All rights reserved.