यह बहुत मुश्किल नहीं होना चाहिए, कम से कम अभिलेखागार के लिए जो पुराने-शैली प्रारूप के साथ संगत हैं जहां फ़ाइल नाम एक निश्चित-आकार (100 बाइट्स) फ़ील्ड में संग्रहीत किए जाते हैं, लेकिन मुझे ऐसे किसी भी उपकरण के बारे में नहीं पता है जो नाम बदल सकता है एक टार संग्रह में जगह में फ़ाइल। इसके अलावा, एक संपीड़ित संग्रह के साथ, आपको वैसे भी एक नई फ़ाइल बनाने की आवश्यकता होगी।
यह और भी आसान होना चाहिए, लेकिन मैं किसी भी मौजूदा टूल के बारे में नहीं जानता, जो एक आर्काइव को फिल्टर कर सकता है, जैसे-जैसे यह फाइल जाती है उसका नाम बदल दिया जाता है। आप स्क्रिप्टिंग भाषाओं में टार लाइब्रेरी के शीर्ष पर एक का निर्माण कर सकते हैं; उदाहरण के लिए, यहाँ पर्ल के साथ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 टार में मक्खी पर सदस्यों का नाम बदलने की क्षमता नहीं है, लेकिन pax
(POSIX के बदले cpio
और tar
) करता है। हालाँकि, आप pax
संग्रह से पढ़ और लिख दोनों नहीं सकते । आप क्या कर सकते हैं एवीएफएस के माध्यम से एक नियमित पेड़ के रूप में संग्रह को उजागर करें , और इसके साथ एक नया संग्रह बनाएं pax
। यह फ़ाइल नाम (रूपांतरित किए गए), सामग्री, समय और मोड को बरकरार रखता है, लेकिन फ़ाइल स्वामित्व को आपके पास रीसेट करता है (जब तक कि रूट के रूप में निष्पादित नहीं किया जाता है)।
mountavfs
cd "~/.avfs$PWD/old.tgz#"
pax -w -s '!bar!baz!' -s '!bar/!baz/' . | gzip >new.tgz