পাইপে আরও একটি টর ফাইল তৈরি করে আমি কীভাবে একটি টার ফাইলের সামগ্রীগুলি ফিল্টার করতে পারি?


13

একটি বহিরাগত সিস্টেমের একক টর ফাইল বিবেচনা করুন যার মধ্যে বিভিন্ন বৈশিষ্ট্যযুক্ত কিছু ডিরেক্টরি রয়েছে যা আমি যেমন অনুমতি, এমটাইমস ইত্যাদি ধরে রাখতে চাই? আমি কীভাবে সহজেই এই ফাইলগুলির একটি উপসেট নিয়মিত ব্যবহারকারীর (রুট নয়) হিসাবে নিতে পারি?

এর মতো কিছু খুঁজছেন:

tar -f some.tar.gz --subset subdir/ | ssh remote@system tar xvz

এটিও গুরুত্বপূর্ণ যে এই টার আর্কাইভের মূল বৈশিষ্ট্যগুলি (মালিকানা, গোষ্ঠী, মোড, এমটাইম) বজায় রাখা উচিত। বাড়ানো শিরোনামের কীওয়ার্ডের মতো ট্যারি ফাইলের অন্যান্য বৈশিষ্ট্যগুলি সম্পর্কে কী ?

এই সাবডিরের মধ্যে বিশাল ফাইল রয়েছে এমন ক্ষেত্রে অস্থায়ী ডিরেক্টরি ব্যবহার করা এড়ানো এমন কোনও সমাধানের জন্য বোনাস পয়েন্ট।

উত্তর:


14

বিএসডিটার (লিবারচাইভের উপর ভিত্তি করে) স্টার্ডিন থেকে স্টডআউট পর্যন্ত টার (এবং কিছু অন্যান্য সংরক্ষণাগার) ফিল্টার করতে পারে। এটি উদাহরণস্বরূপ কেবলমাত্র ফাইলনামগুলির সাথে কোনও প্যাটার্নের সাথে মিলে যায় এবং s/old/new/পুনরায় নামকরণও করতে পারে । এটি ইতিমধ্যে বেশিরভাগ ডিস্ট্রোদের জন্য প্যাকেজ করা হয়েছে, উদাহরণস্বরূপ bsdtarউবুন্টুতে।

sudo apt-get install bsdtar   # or aptitude, if you have it.

# example from the man page:
bsdtar -c -f new.tar --include='*foo*' @old.tgz
#create new.tar containing only entries from old.tgz containing the string ‘foo’
bsdtar -czf - --include='*foo*' @-  # filter stdin to stdout, with gzip compression of output.

নোট করুন যে ইনপুট / আউটপুট জন্য সংক্ষিপ্ত আকারের একটি বিস্তৃত পছন্দ রয়েছে, তাই আপনাকে নিজেই বন্দুকদোল / এলজি 4 এর মাধ্যমে ম্যানুয়ালি পাইপ লাগাতে হবে না। আপনি সিনট্যাক্স -সহ স্টিডিনের জন্য @tarfileএবং / অথবা -স্ট্যান্ডআউটের মতো সাধারণ ব্যবহার করতে পারেন ।


আমার অনুসন্ধানে এই স্ট্রিমিং টার সংশোধনকারী সরঞ্জামটিও পাওয়া গেছে যা জাভাস্ক্রিপ্ট ব্যবহার করে আপনি সংরক্ষণাগার পরিবর্তনগুলি সংজ্ঞায়িত করতে চান বলে মনে হয়। (আমি মনে করি পুরো জিনিসটি জেএসে লেখা আছে)।

https://github.com/mafintosh/tar-stream


1
দুর্দান্ত, জানেন না যে এই @original.tarপদ্ধতিটি বিএসডিটারের মাধ্যমে সম্ভব হয়েছিল। পাশাপাশি বর্ধিত বৈশিষ্ট্য এবং সংকোচনের সাথে কাজ করার জন্য মনে হয়, </var/cache/pacman/pkg/libuv-1.7.0-1-x86_64.pkg.tar.xz bsdtar -czf - --include='usr/share/*' @- | tar tvz(এবং কোনও কারণে একটি খালি নির্বাচন শূন্য বাইটের একটি সিরিজ তৈরি করে, তবে এটি আমার পক্ষে কোনও বড় সমস্যা নয়)।
লেকেনস্টেইন

1
আমার পরীক্ষাগুলি অনুসারে @ old.tgz ব্যবহার করে পুরানো সংরক্ষণাগারগুলি থেকে আসা ফাইলগুলিতে কাজ s/old/new/ করে না , এটি কেবল আসল ফাইলগুলিতে কাজ করে, সরাসরি ফাইল সিস্টেম থেকে সংরক্ষণাগারভুক্ত হয়। এটা সত্যিই লজ্জাজনক, যেহেতু এটি আমার পক্ষে সবচেয়ে দরকারী ব্যবহারের বিষয়।
বার্ট

4

সবচেয়ে সহজ উপায় হ'ল পুরো সংরক্ষণাগারটি অনুলিপি করা; আমার ধারণা আপনি এটি করতে চান না কারণ এটি অনেক বড়।

সাধারণ কমান্ড লাইন সরঞ্জামগুলি ( tar, pax) কোনও সংরক্ষণাগার সদস্যদের অন্য সংরক্ষণাগারে অনুলিপি করে সমর্থন করে না।

আপনার যদি মালিকানা সংরক্ষণের দরকার না হয় তবে আমি FUSE ফাইল সিস্টেম ব্যবহার করার পরামর্শ দেব । আপনি ব্যবহার করতে পারেন archivemount একটি ফাইল সিস্টেম হিসেবে একটি সংরক্ষণাগার মাউন্ট; উত্স সংরক্ষণাগারটির জন্য এটি করুন, এবং মাউন্ট করা ফাইল সিস্টেমে ট্যারি চালান।

archivemount some.tar.gz mnt
cd mnt
tar -cz subdir | ssh example.com tar -xz
fusermount -u mnt

বিকল্পভাবে, আপনি এভিএফএস ব্যবহার করতে পারেন :

mountavfs
cd ~/.avfs$PWD/some.tar.gz\#
tar -cz subdir | ssh example.com tar -xz

বিকল্পভাবে, আপনি tarমূল সংরক্ষণাগারটিতে চালনা করতে পারেন এবং এসএসএইচএফএসের মাধ্যমে রিমোট মেশিনে বের করতে পারেন

sshfs example.com: mnt
cd mnt
tar -xf /path/to/some.tar.gz subdir
fusermount -u mnt

তবে আপনার যদি মালিকানা সংরক্ষণের প্রয়োজন হয় তবে এই সমস্ত পদ্ধতিগুলি জটিল are তারা সকলেই স্থানীয় মেশিনে একটি ফাইল বের করতে জড়িত, সুতরাং এই ফাইলটির মালিকানা হ'ল উদ্দেশ্যযুক্ত দূরবর্তী মালিকানা হতে হবে । এটি রুট হিসাবে চলমান প্রয়োজন এবং যদি ফাইলগুলি স্থানীয় মেশিন এবং দূরবর্তী হোস্টের মধ্যে পৃথক পৃথক পৃথক নাম বা আইডি রয়েছে এমন অ্যাকাউন্টগুলির মালিকানাধীন ফলাফলটি না দেয়।

পাইথনের tarfileলাইব্রেরি টার সদস্যদের কারসাজি করার জন্য মোটামুটি সহজ উপায় সরবরাহ করে, তাই আপনি এগুলিকে এক টর ফাইল থেকে অন্য ট্যুরে পরিবর্তন করতে পারেন। এটি POSIX স্ট্যান্ডার্ড ফর্ম্যাটগুলি (ustar, pax) পাশাপাশি কিছু GNU এক্সটেনশন সমর্থন করে। এখানে একটি অনির্ধারিত পাইথন স্ক্রিপ্ট যা তার স্ট্যান্ডার্ড ইনপুটটিতে একটি টার ফাইল (সম্ভবত gzip বা bzip2 দিয়ে সংকুচিত করা) পড়ে এবং স্ট্যান্ডার্ড আউটপুটে bzip2 দিয়ে সংক্ষেপিত একটি টার ফাইল লেখায়। উত্স থেকে আসা সদস্যরা যদি স্ক্রিপ্টে দেওয়া তর্কটি দিয়ে শুরু করেন তবে তারা অনুলিপি করা হয়।

#!/usr/bin/env python2
import sys, tarfile
source = tarfile.open(fileobj=sys.stdin)
destination = tarfile.open(fileobj=sys.stdout, mode='w:bz2')
for info in source:
    if info.name.startswith(sys.argv[1]):
        destination.addfile(info)
destination.close()

হিসাবে আহবান করা

tar_filter <some.tar.gz subdir/ | ssh example.com tar -xj

1
বিএসডিটার (লিবারচাইভের উপর ভিত্তি করে) ফ্লাই টারে আর্কাইভগুলি ফিল্টার করতে পারে, আমার উত্তর দেখুন।
পিটার কর্ডেস

কাজটি ছিল ফার্মওয়্যার চিত্র থেকে ডেটা উত্তোলন করা, সুতরাং মালিকানা / গোষ্ঠী সদস্যতা অবশ্যই গুরুত্বপূর্ণ। অজগর পদ্ধতির যদিও কাজ করতে পারে।
লেকেনস্টেইন

0

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

mkdir tmp
<some.tar.gz \
fakeroot -- sh -c 'cd tmp && tar -xzf- subdir/ && tar -czf- subdir' |
   ssh remote@system tar -xzvf-
rm -rf tmp

0

জিএনইউতে tarএকটি --deleteবিকল্প রয়েছে:

$ tar -c a b c | tar --delete a | tar -t
b
c

এইভাবে, আপনি আউটপুটটিতে কী অন্তর্ভুক্ত করবেন না তা নির্দিষ্ট করে ইনপুট টারের একটি উপসেট পেতে পারেন ।

দুর্ভাগ্যক্রমে আমি এর --excludeসাথে কাজ করার বিকল্পটি পাইনি --delete, সুতরাং মনে হয় আপনার প্রথমে -tমুছে ফেলার জন্য একটি স্পষ্ট তালিকা ( ) পাওয়া দরকার এবং এরপরে এটি অন্য একটি অনুরোধে প্রেরণ করা উচিত tar

$ tar --delete --no-recursion `tar -t --exclude subdir <some.tar` <some.tar | ssh ...

বা তালিকাটি যদি খুব দীর্ঘ বা জটিল হয় তবে আপনি কোনও বাহ্যিক ফাইলের মধ্যে তালিকাটি সঞ্চয় করতে পারেন:

$ tar -t --exclude subdir <some.tar >to_delete.lst
$ tar --delete --no-recursion -T to_delete.lst <some.tar | ssh ...

-1

আমি যা জানি, tarকমান্ডটি ইনপুট এবং আউটপুট হিসাবে উভয়ই ট্যার বিন্যাস ব্যবহার করতে পারে না । আপনাকে স্থানীয়ভাবে কোনওভাবে স্থানীয়ভাবে ফাইলগুলি বের করতে হবে এবং ফ্লাইট অন ট্যারি ফাইল তৈরি করতে আবার কিছু ব্যবহার করতে হবে, এর সাথে এমন কিছু থাকবে ( -ফাইলের পরিবর্তে স্ট্যান্ডার্ড ইনপুট / আউটপুট ব্যবহৃত হবে):

tar cf - subdir/ | ssh remote@system 'cd extractdir && tar xvf -'

মনে রাখবেন যে tarঅন্য একটি টারফিলের মধ্যে সরাসরি একটি শুল্ক উত্তোলন করতে সক্ষম হওয়া একটি আকর্ষণীয় ধারণা ...


মূল ছাড়াই এটি সমস্ত মালিকানা / গোষ্ঠী তথ্য হারাবে যা আমি স্পষ্টভাবে রাখতে চাই।
লেকেনস্টেইন

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