Tar
重命名 tar 存檔中的目錄
是否可以重命名 tar 存檔中的目錄?我的案例是我有一個外部提供的 RPM 規範文件,該文件假定一個具有特定目錄結構的 tarball,並且我有一個外部提供的 tarball,其頂級目錄名稱與規範文件所期望的不匹配。我不控制生成 tarball 的腳本或 RPM 規範文件,因此我無法更改其中任何一個以匹配另一個。
我一直在做的是解壓縮,更改目錄名稱,然後創建一個新的 tarball,但我想知道是否有替代方法。
這應該不是很困難,至少對於與文件名儲存在固定大小(100 字節)欄位中的舊格式格式兼容的檔案,但我不知道有任何工具可以重命名文件在 tar 檔案中。此外,使用壓縮存檔,無論如何您都需要創建一個新文件。
它應該更容易,但我不知道任何現有的工具可以過濾檔案,重命名文件。您可以在腳本語言的 tar 庫之上建構一個;例如,這是一個概念驗證腳本,用於使用Perl 重命名 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
(POSIX 替換cpio
andtar
)可以。但是,您不能pax
同時從存檔中讀取和寫入。您可以做的是通過AVFS將存檔公開為正常樹,並使用pax
. 這會保留文件名(轉換後的除外)、內容、時間和模式,但會將文件所有權重置為您(除非以 root 身份執行)。mountavfs cd "~/.avfs$PWD/old.tgz#" pax -w -s '!bar!baz!' -s '!bar/!baz/' . | gzip >new.tgz