tar アーカイブ内のディレクトリ名の変更

tar アーカイブ内のディレクトリ名の変更

tarアーカイブでディレクトリの名前を変更できますか?私の使用例は、特定のディレクトリ構造を持つtarballを想定する外部提供RPM仕様ファイルがあり、最上位ディレクトリ名が仕様ファイルで予想されるものと一致しない外部提供tarballがあることです。 tarballまたはRPM仕様ファイルを生成するスクリプトを制御できないため、どちらか一方を他のものと一致するように変更することはできません。

私がやっているのは、解凍してディレクトリ名を変更した後に新しいタールボールを作成することですが、これを行うための別の方法があるかどうか疑問に思います。

ベストアンサー1

ファイル名が固定サイズ(100バイト)フィールドに保存されている以前の形式と互換性のあるアーカイブの場合、これは難しくありません。ただし、tar内でファイル名を変更できるツールはわかりません。アーカイブ。また、圧縮アーカイブの場合はとにかく新しいファイルを作成する必要があります。

簡単に見えますが、実行中にアーカイブをフィルタリングしてファイル名を変更できる既存のツールはありません。スクリプト言語のtarライブラリの上に1つを構築できます。たとえば、以下はtarアーカイブのディレクトリ名を変更する概念証明スクリプトです。パールとArchive::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(POSIXcpioと代替tar)実際に。ただし、paxアーカイブで同時に読み書きすることはできません。あなたができることは、アーカイブを通常のツリーとして公開することです。AVFSをクリックして新しいアーカイブを作成しますpax。これにより、ファイル名(変換された名前を除く)、内容、時間、およびモードが維持されますが、ファイルの所有権は再びユーザーにリセットされます(ルートとして実行されない限り)。

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

おすすめ記事