টারে প্রিফিক্স প্রস্তুত করুন


17

আমি বর্তমানে খুব অকার্যকরভাবে একটি শেলসক্রিপ্টে করি:

cp -a $MYPATH /tmp/$VERSION
cd /tmp
tar cjf archive.tar.bz2 $VERSION

আমি চাই যে $ VERSION নামক ডিরেক্টরিটিতে সবকিছু অন্তর্ভুক্ত থাকে - উপরের স্ক্রিপ্টের মতো সমস্ত কিছু অনুলিপি না করে কি এটি করার কোনও উপায় আছে?


কেন এটি প্রথম স্থানে অনুলিপি করছেন? না কেন tar cjf archive.tar.bz2 $MYPATH?
চ্যুই

2
@ শেভি তিনি বলেছিলেন, তিনি সংরক্ষণাগারে পিতামহীর হিসাবে সংস্করণটি চান want
ক্যান্ট

ওহ, আমি এখন এটি দেখতে।
চেউই

উত্তর:


26

জিএনইউ সংস্করণটির বিকল্পটি (এবং এটির উপনাম ) tarসমর্থন করে , আপনি এটি এটির মতো ব্যবহার করতে পারেন--transform--xform

tar --transform "s/^$MYPATH/$VERSION/" -cf archive.tar.bz2 "$MYPATH"

উদাহরণস্বরূপ, এই ডিরেক্টরি ট্রি দেওয়া

foo
└── foo.txt

আদেশ

tar --transform "s/^foo/bar/" -cf foo.tar.bz2 foo

মত একটি সংরক্ষণাগার উত্পাদন করবে

$ tar -tf foo.tar.bz2
bar/
bar/foo.txt

3
এটি লক্ষণীয় যে এই পদ্ধতির প্রতীকী লিঙ্কগুলি ভেঙে যেতে পারে। Prepending flags=r;সমাধান সমস্যা হিসেবে উল্লেখ stackoverflow.com/a/29661783/388803
Eregon

একটি পিছনে স্ল্যাশ অন্তর্ভুক্ত করবেন না; আমি যখন ট্রান্সফর্মটিতে একটি পেছনের স্ল্যাশ রাখি তখন মূল উপসর্গটি মিস হয়ে যায়; উদাহরণস্বরূপ s/^a\//b\//, অন্যান্য সমস্ত ফাইলের অধীনে থাকা tar -tস্টিলটি দেখায় ; আমি ধরে নিই যে এটি বিপজ্জনক, এবং আমার সত্যিই একই উপসর্গের সাথে অন্য কোনও ফাইলের বিরুদ্ধে সুরক্ষার প্রয়োজন নেই যা টার ফাইলের ডিরেক্টরি নয়; সুতরাং কোনও পিছনে স্ল্যাশ ঠিক নেই, রূপান্তরিত হওয়ার ক্ষেত্রে এটি হ্যান্ডেল করার সর্বোত্তম উপায়টি জানার পক্ষে আমি আপত্তি জানব না তবে এটি যদি মূল নোডের ভাইবোন হয় not a/b/a/aa/
থারস্মমনার

15

বর্তমান ডিরেক্টরিটি ট্যারি করতে এবং একটি উপসর্গ যুক্ত করতে এটি আমার পক্ষে কাজ করেছে:

tar --transform 's,^\.,$VERSION,' -cf foo.tar .

0

আপনি যে ফাইল গাছের গাছের গাছের মধ্যে প্রতীকী লিঙ্ক সংরক্ষণ না করে পালিয়ে যেতে পারেন, আপনি তা করতে পারেন

ln -s $MYPATH /tmp/$VERSION
cd /tmp
tar cjhf archive.tar.bz2 $VERSION

hবিকল্পটির অর্থ ডিগ্রিফার সিমনলিংক, অর্থাৎ লিঙ্কটি যে ফাইল বা ডিরেক্টরিকে নির্দেশ করে সেগুলি অন্তর্ভুক্ত করুন যাতে কেবল একটি সিমলিংক ছিল এবং এটি কী নির্দেশ করেছিল তা রেকর্ড করার চেয়ে লিঙ্কটি নির্দেশ করে।


0

কোনও ডিরেক্টরি উপসর্গটি আরামে যোগ /করতে --transformযুক্তির চেয়ে আলাদা বিভাজক ব্যবহার করুন , যেমন +বা ,অ্যান্ডির উত্তরের মতো।

সুতরাং, একটি সহজ ক্ষেত্রে, আপনি বর্তমান ডিরেক্টরির সকল ফাইলের একটি গুচ্ছ আছে, এবং আপনি একটি তৈরি করতে চাই না tarbomb

tar czf logs_nightly.tar.gz --tranform 's+^+logs_nightly/+' *.log

সিনট্যাক্সটি হ'ল s+search+replace+এবং এর জন্য ^কেবল ফাইল নাম শুরুর সাথে মেলে।

এবং এখন, কেবল ওপিকে উত্তর দেওয়ার জন্য - ভাল, আপনি /tmpচালিয়ে নিজের পুরো ডিরেক্টরিটি অনুলিপি করতে পারবেন :

mv $MYPATH $VERSION
tar cjf archive.tar.bz2 $VERSION
mv $VERSION $MYPATH

বিকল্পভাবে:

ln $MYPATH $VERSION
tar cjf archive.tar.bz2 $VERSION

(হার্ড লিঙ্ক, প্রতিলিঙ্কগুলির সাথে সমস্যা এড়ানো)

শেষ দুটি বিনোদন মূল্যের জন্য অন্তর্ভুক্ত করা হয়েছিল, আমি নিজেই টরোক 2k এর উত্তরকে আঁকড়ে ধরতাম।

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