একটি টার সংরক্ষণাগারের ভিতরে ডিরেক্টরিটির নাম পরিবর্তন করুন


14

টর আর্কাইভের ভিতরে কোনও ডিরেক্টরিটির নামকরণ করা সম্ভব? আমার ব্যবহারের কেসটি হ'ল আমার কাছে একটি বাহ্যিকভাবে সরবরাহ করা আরপিএম স্পেক ফাইল রয়েছে যা একটি নির্দিষ্ট ডিরেক্টরি কাঠামোযুক্ত একটি টারবাল ধরে নিয়েছে এবং আমার কাছে একটি বাহ্যিকভাবে সরবরাহ করা টারবল রয়েছে যার শীর্ষ স্তরের ডিরেক্টরি নামটি স্পেক ফাইলটি প্রত্যাশার সাথে মেলে না। আমি যে স্ক্রিপ্টটি টার্বলগুলি তৈরি করে বা আরপিএম স্পেক ফাইলটি নিয়ন্ত্রণ করি না তাই আমি অন্যগুলির সাথে মেলে সেগুলির মধ্যে কোনওটিতে পরিবর্তন আনতে পারি না।

আমি যা করে যাচ্ছি তা অদম্য, ডিরেক্টরিটির নাম পরিবর্তন করা, এবং তারপরে একটি নতুন টারবাল তৈরি করা, তবে আমি ভাবছিলাম যে এটি করার বিকল্প ছিল কিনা।


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);

জিএনইউ টারে ফ্লাইতে সদস্যদের নাম পরিবর্তন করার ক্ষমতা নেই, তবে pax(পসিক্সের প্রতিস্থাপন cpioএবং এর জন্য tar) রয়েছে। তবে আপনি paxসংরক্ষণাগার থেকে পড়া এবং লেখার জন্য উভয়ই তৈরি করতে পারবেন না । আপনি যা করতে পারেন তা হ'ল আর্কাইভটি এভিএফএসের মাধ্যমে নিয়মিত গাছ হিসাবে প্রকাশ করা এবং এর সাহায্যে একটি নতুন সংরক্ষণাগার তৈরি করা pax। এটি ফাইলের নাম (রূপান্তরিত হিসাবে বাদে), বিষয়বস্তু, সময় এবং মোডগুলি ধরে রাখে তবে আপনার কাছে ফাইলের মালিকানা পুনরায় সেট করে (যতক্ষণ না মূল হিসাবে চালিত)।

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

জিএনইউ টার --transformকমপক্ষে ২০১০ সাল থেকে রয়েছে যা ফ্লাইতে ফাইলের নাম পরিবর্তন করতে দেয়। উদাহরণস্বরূপ, দেখুন: স্ক্রিপ্টসঅ্যান্ডোনিলাইনার্স.ব্লগস্পট.কম
২০১৮ /

@ এ। ড্যানিশচেউস্কি --transformআপনাকে যখন কোনও সংরক্ষণাগার তৈরি বা নিষ্কাশন করার সময় ফাইলগুলির নাম পরিবর্তন করতে দেয়। কিন্তু আপনি সংরক্ষণাগারে ফাইলগুলি না বের করে কীভাবে নাম পরিবর্তন করবেন ? (উত্তোলন ভাল সমাধান নয়: আপনার কাছে পর্যাপ্ত ডিস্কের জায়গা নাও থাকতে পারে; মালিকানার তথ্য সংরক্ষণের অনুমতি আপনার কাছে নাও থাকতে পারে; আপনার কাছে টাইমস্ট্যাম্পগুলি
ঠিকঠাক

ঠিক আছে, হ্যাঁ আমি কেবল আপনার পোস্টে দেখেছি যে "জিএনইউ টার ফ্লাইতে সদস্যদের নাম পরিবর্তন করার ক্ষমতা রাখে না" - এটি কেবলমাত্র / বাইরে যাওয়ার পথেই ঘটে। আপনি যদি কোনও বিদ্যমান সংরক্ষণাগারটির মধ্যে নাম পরিবর্তন করতে চান তবে আপনি এটি সংরক্ষণের জন্য আর্কাইভমাউন্টটি একটি ডিরেক্টরিতে মাউন্ট করতে পারেন, আপনি যে নামটি চান তা পরিবর্তন করতে এবং এটি আনমাউন্ট করতে পারেন।
ড্যানিশচেউস্কি

3

Sr_- এর হ্যাক এবং গিলসের উত্তর দুটিই খুব ভাল লাগছে, তবে আপনার সমস্যাটি যদি টার্বল টার্গেটের কেবল মূল ডিরেক্টরি নাম হয়, আরপিএমবাইল্ড চলাকালীন একটি ভিন্ন সমাধান হতে পারে %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 বলতে% সেটআপ ম্যাক্রো-তে পাস করতে পারেন


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আপনাকে এটিকে ঘিরে ফেলতে পারে))

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.