টার আর্কাইভের পাথগুলি এটি না বের করে রূপান্তর করুন


10

GNU tar(1)এর একটি ঝরঝরে বিকল্প রয়েছে --transform। ম্যান পৃষ্ঠা থেকে:

--transfor, --xform এক্সপ্রেসন
ব্যবহার করুন ফাইলের নাম রূপান্তর করতে এক্সপ্রেসন প্রতিস্থাপন

সংরক্ষণাগারটি আর্কাইভ করা হচ্ছে বলে এটি ফ্লাইটিতে পাথের নামগুলির পরিবর্তনের অনুমতি দেয় যাতে এটি কোথায় এবং কীভাবে বের করা হবে তা আপনি নিয়ন্ত্রণ করতে পারেন।

আমার প্রশ্ন হ'ল, সিটুতেও একই ধরণের রূপান্তর সম্পাদনের উপায় আছে ; অর্থাত্, সংরক্ষণাগারটি বের না করে?

উদাহরণ

[user@host]$ tar tf test.tar
./foo/blah  ./foo/bleh
[user@host]$ some_deep_magic 's/foo/bar/' test.tar
[user@host]$ tar tf test.tar
./bar/blah  ./bar/bleh

ব্যবহারের ক্ষেত্রে

আমি tarমূলত নিখুঁত শেষ ব্যবহারকারীদের কাছে একটি সংরক্ষণাগার বিতরণ করছি এবং এটি আমার কাছ থেকে কোনও হস্তক্ষেপ ছাড়াই সঠিক পথে প্রবেশ করতে চাইবে। আমি সংরক্ষণাগারটি বের করার, ডিরেক্টরিগুলির নতুন নামকরণ এবং সংরক্ষণাগারটি লার্জিক হওয়ায় পুনঃস্থাপনের তুচ্ছ সমাধান এড়াতে চেষ্টা করছি।


নামগুলি তৈরি করার সময় আপনি কেন রূপান্তর করবেন না?
হোসে লুইস মার্টিন

পুনঃটুইট আমার ব্যবহারের ক্ষেত্রে হ'ল সংরক্ষণাগারটি ইতিমধ্যে সেখানে আছে এবং যেমনটি আমি বলেছিলাম, আমি আনপ্যাকিং, রূপান্তরকরণ এবং পুনরায় পোস্টিং এড়াতে চাই।
জোসেফ আর।

1
আপনি তারার স্ট্রিমটি আসলে এটি ডিস্কে না বের করেই সংশোধন করতে পারবেন: github.com/mafintosh/tar-stream#modifying-existing-tarballs , perldoc.perl.org/5.10.1/ আর্কাইভ / টার এইচটিএমএল , ইত্যাদি
ভ্লাদার

উত্তর:


3

আপনি সংরক্ষণাগারমাউন্ট বা মাউন্টভেফগুলি দিয়ে সংরক্ষণাগারটি মাউন্ট করতে এবং এটি আবার পুনরায় তৈরি করতে পারেন

archivemount tarfile.tar /mnt
cd /mnt
tar cf /tmp/tarfile.tar --transform 's/foo/bar/' .

সংরক্ষণাগার ফাইল সিস্টেমে লেখার ক্রিয়াকলাপগুলি অমাউন্টগুলিতে একটি সম্পূর্ণ পুনর্লিখনকে সুগন্ধযুক্ত করে তুলবে, তাই বড় ফাইলগুলির জন্য ভাল বিকল্প বলে মনে হয় না।

সম্পাদনা

আমি বাস্তবায়নের বিশদ জানি না তবে মনে হয় আমরা ফাইল সিস্টেমের ধাপে রাইটিং ফাইলগুলি সংরক্ষণ করছি।

কেবলমাত্র ছেলেদের সমাধানের জন্য পরীক্ষা করুন (আমার / ইউএসআরের একটি টারে উপরে)

#!/bin/bash

# try to avoid slab cache issues 
cat /tmp/usr.tar > /dev/null

T="$(date +%s)"
tar xf /tmp/usr.tar
tar cf usr.tar usr --transform 's/usr/foo/'
T="$(($(date +%s)-T))"
echo "Tar/Untar seconds: ${T}"

T="$(date +%s)"
archivemount -o readonly -o nobackup /tmp/usr.tar /mnt
tar cf usr.tar /mnt  --transform 's/usr/foo/'
umount /mnt
T="$(($(date +%s)-T))"
echo "Archivemount seconds: ${T}"

T="$(date +%s)"
mountavfs
cd '/root/.avfs/tmp/usr.tar#'
tar cf /tmp/test/usr.tar   --transform 's/usr/foo/' .
T="$(($(date +%s)-T))"
echo "Avfs seconds: ${T}"

আউটপুট:

Tar/Untar seconds: 480
Archivemount seconds:  failure, a lot of read errors.
Avfs seconds: 217

তাই অ্যাভস জিতল!


1
+1 আকর্ষণীয় নতুন কমান্ড। কিন্তু সংরক্ষণাগারটি আনপ্যাক করার পক্ষে এই পদ্ধতির কীভাবে আলাদা? আমি বাস্তবায়ন-ভিত্তিক কথা বলছি না, পারফরম্যান্স-ভিত্তিতে বলছি।
জোসেফ আর।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.