टार संग्रह के अंदर निर्देशिका का नाम बदलें


14

क्या टार आर्काइव के अंदर एक निर्देशिका का नाम बदलना संभव है? मेरा उपयोग मामला यह है कि मेरे पास बाहरी रूप से प्रदान की गई RPM युक्ति है जो एक निश्चित निर्देशिका संरचना के साथ एक टारबॉल मानती है, और मेरे पास एक बाह्य रूप से प्रदान की गई टारबॉल है जिसका शीर्ष-स्तरीय निर्देशिका नाम मेल फ़ाइल की अपेक्षा से मेल नहीं खाता है। मैं या तो स्क्रिप्ट को नियंत्रित नहीं करता हूं जो टारबॉल या RPM युक्ति फ़ाइल उत्पन्न करता है, इसलिए मैं दूसरे से मेल खाने के लिए दोनों में से कोई भी बदलाव नहीं कर सकता।

मैं जो कर रहा हूं वह असत्य है, निर्देशिका नाम को बदलना, और फिर एक नया टारबॉल बनाना, लेकिन मैं सोच रहा था कि क्या ऐसा करने का कोई विकल्प था।


3
दुर्भाग्य से मुझे संदेह है, लेकिन मुझे यह देखने में दिलचस्पी होगी कि क्या किसी और के पास कोई रास्ता है। मुझे लगता है कि आपकी सबसे अच्छी शर्त एक स्क्रिप्ट को असत्य, नाम बदलना और री-टार लिखना है।
केविन

जवाबों:


8

यह बहुत मुश्किल नहीं होना चाहिए, कम से कम अभिलेखागार के लिए जो पुराने-शैली प्रारूप के साथ संगत हैं जहां फ़ाइल नाम एक निश्चित-आकार (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

GNU टार --transformकम से कम 2010 के बाद से है जो मक्खी पर फ़ाइलों का नाम बदलने की अनुमति देता है। एक उदाहरण के लिए, देखें: scriptandoneliners.blogspot.com/2019/11/…
A.Danischewski

--transformजब आप एक संग्रह बनाते या निकालते हैं तो @ A.Danischewski आपको फ़ाइलों का नाम बदलने देता है। लेकिन आप इसे कैसे निकाले बिना किसी संग्रह में फ़ाइलों का नाम बदलें ? (एक्सट्रैक्शन एक अच्छा समाधान नहीं है: आपके पास पर्याप्त डिस्क स्थान नहीं हो सकता है; आपके पास स्वामित्व जानकारी को संरक्षित करने की अनुमति नहीं हो सकती है; आपके पास टाइमस्टैम्प को ठीक से संरक्षित करने की क्षमता नहीं हो सकती है ...)
गाइल्स का SO- बुराई होना बंद करें '

ठीक है, हाँ, मैंने अभी आपकी पोस्ट की स्थिति देखी कि "GNU टार मक्खी पर सदस्यों का नाम बदलने की क्षमता नहीं है" - यह करता है लेकिन केवल रास्ते में / बाहर। यदि आप किसी मौजूदा संग्रह में नाम बदलना चाहते हैं, तो आप संग्रह को एक निर्देशिका में माउंट करने के लिए उपयोग कर सकते हैं, आप जो भी नाम चाहते हैं उसे बदल सकते हैं और इसे हटा सकते हैं।
ए.निस्क्यूस्की

3

Sr_ का हैक और गाइल्स दोनों का उत्तर बहुत अच्छा लगता है, लेकिन अगर आपकी समस्या रूट टारबॉल के सिर्फ रूट डायरेक्टरी नाम की है, तो rpmbuild चलाते समय, एक अलग समाधान फिर से परिभाषित करने के लिए हो सकता है %setup मैक्रो को लिए आवश्यक ।

कुछ ऐसा है (आपको इसे अपने वास्तविक कॉन्फ़िगरेशन में, विशेष रूप से बदलने old-dirऔर desired-dirसही अपघटन उपकरण का उपयोग करके इसे परिष्कृत और परिष्कृत करना होगा) ~/.rpmmacros:

%setup cd ../BUILD \
rm -rf cd-player \
bunzip2 -dc ../SOURCES/%{name}-%{version}.tar.bz2 | tar -xvvf - \
if [ $? -ne 0 ]; then \
  exit $? \
fi \
mv <old-dir> <desired-dir> \
cd <desired-dir> \
cd ../BUILD/cd-player \
chmod -R a+rX,g-w,o-w .

मैं ईमानदारी से ऐसा नहीं करूँगा यदि सबसे अधिक विदेशी स्थिति में नहीं है, लेकिन आपका मामला हो सकता है :)


2

इस पृष्ठ को देखें लेकिन उचित उत्तर कहीं और देखें:

http://www.rpm.org/max-rpm/s1-rpm-inside-macros.html

यह कहता है कि आप टापबॉल के भीतर शीर्ष स्तर के फ़ोल्डर का नाम rpmbuild बताने के लिए% setup मैक्रो को पास कर सकते हैं


1

बदसूरत हैक, लेकिन शायद यह आपकी मदद करता है, सहानुभूति के tarसाथ बेवकूफ बनाना :

$ mkdir a b
$ date >> b/foo
$ tar zcvf b-foo.tgz b/foo
$ rm -rf b
$ ln -s a b

$ tar zxvf b-foo.tgz                                                              
x b/foo: Cannot extract through symlink b
tar: Error exit delayed from previous errors.
$ tar zxvPf b-foo.tgz                                                             
x b/foo
$ ls a
foo

इसके बारे में सोचकर, यह शायद नहीं करता, जैसा rpmकि आप तर्क के साथ खिलवाड़ नहीं होने देंगे tar, क्या यह होगा? (संपादित करें: हो सकता है कि कुछ पेचीदा tarरैपर स्क्रिप्ट $PATHआपको इसके आसपास मिल सके।)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.